gpt4 book ai didi

generics - Typescript 无法检测索引签名中泛型方法的参数类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:00:26 25 4
gpt4 key购买 nike

我有一个定义索引签名的接口(interface):

interface MethodCollection {
[methodName: string]: (id: number, text: string) => boolean | void;
}

这里一切都很好,我添加到此类对象的任何方法都将正确识别其参数类型:

var myMethods: MethodCollection = {
methodA: (id, text) => {
// id: number
// text: string
}
}

现在,我需要为这些函数添加一个类型参数:

interface MethodCollection {
[methodName: string]: <T>(id: number, text: string, options: T) => boolean | void;
}

当我这样做的时候,TypeScript 编译器就吐了:

Parameter 'text' implicitly has 'any' type

Parameter 'options' implicitly has 'any' type

Parameter 'id' implicitly has 'any' type

事实上,IntelliSense 也不能再跟踪正确的类型,它们都变成隐式的 any:

var myMethods: MethodCollection = {
methodA: (id, text, options) => {
// id: any
// text: any
// options: any
}
}

为什么会这样?如何使用带有索引签名的泛型方法?我正在使用 Visual Studio 2013,我的项目设置为使用 TypeScript 1.6 版。

最佳答案

您可以通过使接口(interface)成为通用接口(interface)来使类型推断起作用,并在创建变量时指定它。

interface MethodCollection<T> {
[methodName: string]: (id: number, text: string, options: T) => boolean | void;
}

var myMethods: MethodCollection<string> = {
methodA: function(id, text, options) {
// id :number,
// text: string,
// options: string
}
}

使用 VSCode 和 tsc 1.9.0(当前 typescript@next),这是唯一的工作方式。

虽然这不允许您为不同的方法使用不同的类型。

但是,您可以为 MethodCollection 提供一个可选类型。

var myMethods: MethodCollection<string | boolean> = {
methodA: function(id, text, options) {
// options is string | boolean
}
}

关于generics - Typescript 无法检测索引签名中泛型方法的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35800958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com