#typescript
Вопрос:
В этом примере кода B расширяет A, чтобы значение B могло перейти в переменную A. Но, по какой-то причине, которую я не понимаю, это не относится к параметрам функций :
interface A { foo: string };
interface B extends A { bar: string };
let a: A = {foo: "foo"};
let b: B = {foo: "foo", bar: "bar"};
a = b; // OK
type AFUNC = (a: A) => true;
type BFUNC = (b: B) => true;
let aGetter: AFUNC = a => true;
let bGetter: BFUNC = b => true;
aGetter = bGetter; // Error :
// Type 'BFUNC' is not assignable to type 'AFUNC'.
// Types of parameters 'b' and 'a' are incompatible.
// Property 'bar' is missing in type 'A' but required in type 'B'.ts(2322)
Почему TS предполагает BFUNC = b => true
, что его нельзя назначить AFUNC = a => true
?
Спасибо!
Ответ №1:
Поскольку позиции параметров типа функции проверяются контравариантно, вы можете назначить наоборот, т. Е. bGetter = aGetter
Работает, но нет aGetter = bGetter
. См. игровую площадку.
Комментарии:
1. Ладно, я понял. Я не понимал, почему это так себя ведет, пока не прочитал эту хорошо объясненную статью : medium.com/@michalskoczylas/…