TS : унаследованные интерфейсы вызывают ошибку типа в параметрах функций

#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/…