Версия TypeScript: 2.0.3 / nightly (2.1.0-dev.201xxxxx)
2.0.3
Код
function test(val: 'AAA'|'BBB'){
//xxx
}
let a = true ? 'AAA' : 'BBB';
test(a);
Ожидаемое поведение:
Скомпилировано успешно
Фактическое поведение:
Получил ошибку:
Ошибка TS2345: аргумент типа «строка» не может быть назначен параметру типа «AAA» | «BBB» '.
Это обсуждалось несколько раз.
Во-первых, вы назначаете переменную let, что означает, что компилятор предполагает, что вы можете захотеть изменить значение в будущем, поэтому он не присваивает переменной строковый литерал.
Кроме того, в 2.0 никогда не было вывода литералов. Разработчик должен будет сделать это явно. Итак, чтобы исправить это:
function test(val: 'AAA'|'BBB'){
//xxx
}
let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);
Но в TypeScript 2.1 он будет интерпретировать присвоения const
самым строгим способом, поэтому вы можете сделать это так:
function test(val: 'AAA'|'BBB'){
//xxx
}
const a = true ? 'AAA' : 'BBB';
test(a);
Самый полезный комментарий
Это обсуждалось несколько раз.
Во-первых, вы назначаете переменную let, что означает, что компилятор предполагает, что вы можете захотеть изменить значение в будущем, поэтому он не присваивает переменной строковый литерал.
Кроме того, в 2.0 никогда не было вывода литералов. Разработчик должен будет сделать это явно. Итак, чтобы исправить это:
Но в TypeScript 2.1 он будет интерпретировать присвоения
const
самым строгим способом, поэтому вы можете сделать это так: