我有一个定义索引签名的接口:
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:
参数'text'隐式具有'any'类型
参数'options'隐式具有'any'类型
参数'id'隐式具有'any'类型
事实上,IntelliSense也不能再追踪正确的类型,它们都变得隐含any
:
var myMethods: MethodCollection = {
methodA: (id, text, options) => {
// id: any
// text: any
// options: any
}
}
为什么会这样?如何将通用方法与索引签名一起使用?我正在使用Visual Studio 2013,我的项目设置为使用TypeScript版本1.6。
答案 0 :(得分:2)
您可以通过使接口通用来使类型推断工作,并在创建变量时指定它。
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(当前打字稿@ next),它是唯一可行的方式。
但是,不允许你为不同的方法使用不同的类型。
但是,您可以为MethodCollection提供可选类型。
var myMethods: MethodCollection<string | boolean> = {
methodA: function(id, text, options) {
// options is string | boolean
}
}