我最近升级了TypeScript 2.4,并且遇到了几个错误,这些错误抱怨我的类型不再可分配。
以下是我遇到错误的情形:
在 TypeScript 2.3 中,这是可以接受的,但是在 TypeScript 2.4 中会产生错误。
以下是我遇到错误的情形:
interface Parent {
prop: any
}
interface Child extends Parent {
childProp: any
}
type Foo<T> = <P extends Parent>(parent: P) => T
function createFooFunction<T>(arg: T): Foo<T> {
// Error here!
return (child: Child): T => {
return arg;
}
}
在 TypeScript 2.3 中,这是可以接受的,但是在 TypeScript 2.4 中会产生错误。
Type '(child: Child) => T' is not assignable to type 'Foo<T>'.
Types of parameters 'child' and 'parent' are incompatible.
Type 'P' is not assignable to type 'Child'.
Type 'Parent' is not assignable to type 'Child'.
Property 'childProp' is missing in type 'Parent'.
关于错误的最后一行,我注意到如果我将子元素的属性设置为可选的,那么typescript就会满意,即如果我进行以下更改
interface Child extends Parent {
childProp?: any
}
尽管这不是一种理想的修复方式,因为在我的情况下,childProp是必需的。
我还注意到直接将Foo的参数类型更改为Parent也可以满足TypeScript的要求,即进行此更改:
type Foo<T> = (parent: Parent) => T
然而,这也不是解决方法,因为我无法控制Foo类型或Parent类型。它们都来自供应商的.d文件,因此我不能修改它们。
但无论如何,我不确定为什么会出现这种错误。Foo类型表明它需要继承自Parent的东西,而Child就是这样一个对象,那么为什么typescript认为它不可分配呢?
编辑:我将其标记为已回答,因为添加--noStrictGenericChecks
标志可以抑制错误(在此被接受的答案)。然而,我仍然想知道为什么这是一个错误,因为如果我的代码有误,我宁愿保持严格检查并进行重构,而不是简单地绕过它。
因此,再次强调问题的核心,既然Child继承了Parent,为什么typescript不再认为Child可以分配给Parent,并且从面向对象的泛型角度看,为什么这样做更正确?