Typescript 2.4 在简单泛型用例中导致编译错误

Typescript 2.4 causes compilation errors in simple generics use cases

我一直在尝试将一个项目从 TypeScript 2.3 升级到 2.4,但事实证明这相当令人沮丧和困惑。我收到一些我无法理解的与泛型相关的错误。

我分解了一段代码并尽可能简化了它:

interface Service  {
    serviceName: string;
}

interface TableParams {
    selectionListLabelFn: <T>(item: T) => string;
}

const tableParams: TableParams = {
    selectionListLabelFn: (service: Service) => service.serviceName
};

上面的代码产生了以下错误:

λ tsc test.ts
test.ts(9,7): error TS2322: Type '{ selectionListLabelFn: (service: Service) => string; }' is not assignable to type 'TableParams'.
  Types of property 'selectionListLabelFn' are incompatible.
    Type '(service: Service) => string' is not assignable to type '<T>(item: T) => string'.
      Types of parameters 'service' and 'item' are incompatible.
        Type 'T' is not assignable to type 'Service'.

为什么会这样?这对我来说毫无意义。

我不确定你想要达到什么目的,但这个错误不是错误。原因是 selectionListLabelFn 被声明为通用委托,因此应该传入一个通用委托,而不是具有 Service 参数的委托。您可以像这样创建一个通用箭头函数:

const tableParams: TableParams = {
    selectionListLabelFn: <T>(service: T) => ""
};

如果你想让selectionListLabelFn绑定到Service,你可以尝试在接口上声明它:

interface TableParams<T> {
    selectionListLabelFn: (item: T) => string;
}    
const tableParams: TableParams<Service> = {
    selectionListLabelFn: (service: Service) => service.serviceName
};

版本之间的规则可能更严格,但我不一定对错误感到惊讶。我想我可能与 2.4

中包含的 this 项有关