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 项有关
我一直在尝试将一个项目从 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 项有关