2016-11-19 3 views
0

Я пытаюсь создать функцию машинописи, которая имеет два параметра типа, где один параметр типа использует другой:машинописи компиляция TS2322 ошибки при присвоении значения универсального типа

interface Wrapper<T> { 
    value: T; 
} 

function func<T, W extends Wrapper<T>>(val: T, takesWrapper: (w: W) => void) { 
    const wrapper: W = { value: val }; 
    takesWrapper(wrapper); 
} 

func(32, num => { console.log(Math.abs(num.value) + 10); }); 

машинопись компилятор дает ошибка в строке const wrapper: W = { value: val };:

test.ts(6,11): error TS2322: Type '{ value: T; }' is not assignable to type 'W'. 

Однако, как W расширяет Wrapper<T>, присвоенное значение { value: val } где val имеет тип T должен быть действительным.

Почему компилятор TypeScript дает ошибку компиляции в этом случае?

ответ

2

Вы создаете объект, который не может быть назначен W. Например:

interface ExtendedWrapper<T> extends Wrapper<T>{ 
    anotherValue: T; 
} 

{ value: 1 } не присваиваемые ExtendedWrapper<number> (свойство anotherValue отсутствует).

Вы можете преодолеть это, используя утверждение типа const wrapper = { value: val } as W;, но имейте в виду, что функция takesWrapper ожидает расширенного типа.