Typescript无法检测索引签名

时间:2016-03-04 16:20:44

标签: generics interface typescript

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

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。

1 个答案:

答案 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
    }
}