Недавно я обновился до 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'.
Что касается последней строки ошибки, я заметил, что если я сделаю свойства Child необязательными, то машинопись будет удовлетворена, т.е. если я сделаю это изменение
interface Child extends Parent {
childProp?: any
}
Хотя это не идеальное решение, так как в моем случае требуется childProp.
Я также заметил, что изменение типа аргумента Foo непосредственно на Parent также удовлетворит машинописный текст, т.е. внесение этого изменения
type Foo<T> = (parent: Parent) => T
Это тоже не исправление, так как я не контролирую ни тип Foo, ни Parent. Оба они взяты из файлов поставщика .d, поэтому я не могу их изменить.
Но в любом случае, я не уверен, что понимаю, почему это ошибка. Тип Foo говорит, что ему требуется что-то, что расширяет Parent, и Child является таким объектом, так почему же typescript считает, что его нельзя назначать?
Изменить: я пометил это как ответ, поскольку добавление флага --noStrictGenericChecks
подавляет ошибки (принятый ответ здесь). Тем не менее, я все же хотел бы знать, почему это ошибка, в первую очередь, поскольку я бы предпочел сохранить строгие проверки и реорганизовать свой код, если он неправильный, а не просто замкнуть его.
Итак, чтобы повторить суть вопроса, поскольку Child расширяет Parent, почему машинописный текст больше не думает, что Child можно присвоить Parent, и с точки зрения дженериков ООП, почему это более правильно, чем было раньше?