我有一个定义索引签名的接口:
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编译器barfs up:
Parameter ‘text’ implicitly has ‘any’ type
Parameter ‘options’ implicitly has ‘any’ type
Parameter ‘id’ implicitly has ‘any’ type
事实上,IntelliSense也不能再跟踪正确的类型,它们都变得隐含在任何:
var myMethods: MethodCollection = {
methodA: (id, text, options) => {
// id: any
// text: any
// options: any
}
}
为什么会这样?如何将通用方法与索引签名一起使用?我正在使用Visual Studio 2013,我的项目设置为使用TypeScript版本1.6.
最佳答案 您可以通过使接口通用来使类型推断工作,并在创建变量时指定它.
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
}
}