泛型 – 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 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
    }
}
点赞