2016-08-31 6 views
19

演算子 '==' は活字体2のタイプのXおよびYには適用できない

活字体バージョン: 2.0.2.0

コード Iコードが少し愚かである知っています、実際に私のコードで(表現の訪問者を作る)これらの種類のテストをしていると私は本当にこれらがすぐに飛んでコンパイルする必要があると思う。

var a: boolean = (true == false); 
var b: boolean = (5 == 2); 

は、その代わりに等しいそのオペランドがタイプ「真」、「偽」、「5」と「2」に適用することはできません文句を言います。マークは、彼らがブール値または数値ではないことを、彼らは実際には、「真」「偽」、「5」、「2」のタイプです。私はタイプ「文字列」と「ブール」を比較することはできないことを知って、ちょっと、5は実際には数は、「5」と入力されていないか、私は間違っていますでしょうか?

しかしこれはコンパイルされます。

let x = 2; 
var a: boolean = 5 == x; 
var b: boolean = <number>5 == <number>2; 

私は何かが見つからないのですが、なぜ5と2が「番号」のタイプと考えられないのですか?

期待される動作:

実際の行動をコンパイルする必要があります:「オペランド 『==を言って、コンパイルエラーで 結果は<最初の引数>「と」<第二引数』タイプに適用することはできません」 > '

背景私はこの問題をtypescriptで説明しましたが、これはこのようにする必要があると定義していますが、どうしたらよいでしょうか? https://github.com/Microsoft/TypeScript/issues/6167

答えて

6

リテラルの型は、多くの利点を持って十分なモチベーションを参照してください場合は、問題を作成すること自由に感じ、できるだけ狭いタイプを作ります。あなたのユースケースは非常にまれに来るんですが、種類はできるだけ狭いことを希望することは、言語の設計全体に浸透します。ですから、この1つの具体的なケースではあなたの人生はより困難になりますが、言語全体としては意味があります。このまれな使用例をサポートするためには、ユーザーは著しく悪い言語に苦しむ必要があります。

残念ながら、2番目の例では、明示的に入力する必要があります。彼らはこれを実行しようとした場合、ユーザーの大半は叫ぶする言語を望んでいるので、私は、これは今までに固定されて表示されません。大部分のケースではおそらくバグの兆候です。

8

why isn't 5 and 2 consider as types 'number'

ザ・リテラルタイプ52を持っています。例えば

var x: 5; 
// can only ever be assigned to 5 
x = 5; // okay 
x = 2; // Error 

エラーではないことを望む実際の使用例はありません。これはあなたを助けようとしているコンパイラです。あなたはそれがコンパイラをすることができますよう

+1

私はxがタイプ5でなければならないと言いますが、私が5を単独で使用しているときは、それが「数字」タイプであると思いました。 – Lostfields

+1

@Lostfieldsあなたは 'let x = 5'は' let x = 5 as number; 'を意味すると思いますが、 'let x = 5 as 5'を意味します。どの時点であなたは基本的にtypescriptを無効にしています: 'let x = 5 as any' – JLarky

3

Erlangの開発者は、私はアーランのエラーのこの種を見るために使用されるが、それは活字体で何を意味するのかわからないし、ここにあなたが問題を理解するのに役立ちます例ですよう:

let answer: "yes" | "no" | "maybe" = "yes"; 
if (Math.random() > 0.5) { 
    answer = "maybe"; 
} 

if (answer === "yes") { 
    console.log('yes'); 
} 

if (answer === "no") { 
    console.log('no'); 
} 

それはエラーでコンパイルされません:

error TS2365: Operator '===' cannot be applied to types '"yes" | "maybe"' and '"no"'. 

まず、ここでは解決

let answer = "yes" as "yes" | "no" | "maybe"; 
012です

今説明:このコードは非常にシンプルで、コンパイル時に理解できるので

、活字体がanswer"no"なる可能性がコードには場所がありませんことを知っているので、それはちょうどあなたに言います(ただし、非常に不可解な形で)その答えは常に「いいえ」ではないので、文字通りそれが本当であるかどうかをチェックする理由はありません。しかし、(Erlangのように)これは、例えば、answer"no"にするデバッグ用のコードをコメントアウトすることに決めたとき、非常に明白な理由で起こる可能性があります。今度はlet answer = "yes" as "yes" | "no" | "maybe";またはlet answer = <("yes" | "no" | "maybe")>"yes";を使用すると、TypeScriptは、コードでそれを見ることができない場合でも「yes」が「no」になると考えます。だから、一時的に削除コードの場合のために第二の溶液があります:

if (0) { 
    answer = "no"; 
} 

この条件は、本当であることを考えるように活字体コンパイラのための十分な「複雑」である真なることはありませんにもかかわらず。私のErlangのアプローチはで、if (x && !x) {となりますが、少なくとも2.4では数式を使用できます。

しかし、いくつかの点で、コンパイラがちょうどいいことと、その後かもしれないソリューション"no"のチェックを削除することです:)

だからあなたのコードを作るために、OPの質問にそれを戻ってあなたにそれを変更する必要がコンパイル:

var a = false; 
var b = false; 

コンパイラがそれを知っていれば、おそらくそれも分かっていたでしょう。

関連する問題