Typescript: Переменная не распознается как строковый литерал при использовании тернарного оператора

Созданный на 3 нояб. 2016  ·  1Комментарий  ·  Источник: microsoft/TypeScript



Версия 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» '.

Question

Самый полезный комментарий

Это обсуждалось несколько раз.

Во-первых, вы назначаете переменную 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 никогда не было вывода литералов. Разработчик должен будет сделать это явно. Итак, чтобы исправить это:

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);
Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

siddjain picture siddjain  ·  3Комментарии

Antony-Jones picture Antony-Jones  ·  3Комментарии

manekinekko picture manekinekko  ·  3Комментарии

kyasbal-1994 picture kyasbal-1994  ·  3Комментарии

uber5001 picture uber5001  ·  3Комментарии