Пересечение типов функций TypeScript

Типы пересечения типов функций ведут себя не так, как я ожидал. Возьмите этот образец:

var c: ((x: number) => void) = x => { };

Это компилируется просто отлично. x — это число в лямбде.

Но это не удается:

var c: ((x: number) => void) & ((x: number | string) => void) = x => { };

В нем говорится, что «x неявно имеет тип «любой»». (Компиляция с --noExplicitAny.)

Даже это терпит неудачу с тем же замечанием:

var c: ((x: number) => void) & ((x: number) => void) = x => { };

Это означает, что не для всех типов T, T & T совпадает с T, что действительно странно.


person John    schedule 26.11.2016    source источник


Ответы (1)


Я не думаю, что пересечение типов должно было использоваться таким образом. Возможно, компилятор просто не может вычислить тип x и присваивает любой, который терпит неудачу из-за опции компилятора.

Также гораздо понятнее просто определить несколько типов для самого x вместо объединения типов двух функций.

var c: ((x: number | string) => void)  = x => { };
person toskv    schedule 26.11.2016