Typescript: 三項演算子を使用すると、変数が文字列リテラル型として認識されない

作成日 2016年11月03日  ·  1コメント  ·  ソース: microsoft/TypeScript



TypeScriptバージョン: 2.0.3 /毎晩(2.1.0-dev.201xxxxx)
2.0.3

コード

function test(val: 'AAA'|'BBB'){
  //xxx
}

let a = true ? 'AAA' : 'BBB';
test(a);

予想される行動:
正常にコンパイルされました

実際の動作:
エラーが発生しました:

エラーTS2345:タイプ 'string'の引数はタイプ '"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 評価