2016-09-30 10 views
0

I持っている書籍https://hamednourhani.gitbooks.io/typescript-book/活字体の制御フロー解析

interface Square { 
    kind: "square"; 
    size: number; 
} 

interface Rectangle { 
    kind: "rectangle"; 
    width: number; 
    height: number; 
} 

interface Circle { 
    kind: "circle"; 
    radius: number; 
} 

type Shape = Square | Rectangle | Circle; 

//Type of function: function area1(s: Square | Rectangle | Circle): number | undefined 
function area1(s: Shape) { 
    if (s.kind === "square") { 
     return s.size * s.size; 
    } 
    else if (s.kind === "rectangle") { 
     return s.width * s.height; 
    } 
    else if (s.kind === "circle") { 
     return Math.PI * s.radius * s.radius; 
    } 
    else { 
     //Type 'Square | Rectangle' is not assignable to type 'never'. 
     const _exhaustiveCheck: never = s; 
    } 
} 

//Function lacks ending return statement and return type does not include 'undefined'. 
function area2(s: Shape): number { 
    switch (s.kind) { 
     case "square": return s.size * s.size; 
     case "rectangle": return s.width * s.height; 
     case "circle": return Math.PI * s.radius * s.radius; 
     default: const _exhaustiveCheck: never = s; //Type of s is 'never' 
    } 
} 

質問(--strictNullChecks)から、次のコード:2つの機能s

  • なぜ式で_exhaustiveCheck: never = s は異なるタイプがありますか?どちらの場合でも、はneverと予想されました。
  • なぜarea2関数は返品タイプnumber | undefinedを持っていますか?未定義の私にはここで決して起こることができないようです。私が間違っている?

答えて

1

私は本のURLが間違っているブックhttps://hamednourhani.gitbooks.io/typescript-book/

から、次のコードを持っています。元のものはhttp://basarat.gitbooks.io/typescript/です。フリーでオープンソースなので、人々は自由に複製を作成できます。多くのことを気にしません(意図的ではないと思われますが、私は悪意を持っていないと思われます)が、最新バージョンのリンクについて言及したいと考えました。あなたの質問に今すぐに

なぜ2つの関数で式_exhaustiveCheck:never = sは異なるタイプを持っていますか?私は両方の場合にsが決してないと思った。

あなたが投稿したコードは、あなたがそれを修正:)

厥の罰金を想定するとも書籍の関連セクションhttps://basarat.gitbooks.io/typescript/content/docs/types/discriminated-unions.html内のコードではありません。あなたのサンプルを実行すると、両方のバージョンでneverが得られます。そして、あなたが見ることができるようにsはどちらの場合もneverタイプであり、エラーはありません。コメントは間違っている:

enter image description here

AREA2関数は戻り値の型数を持って望んでいる理由|未定義?未定義の私にはここで決して起こることができないようです。私が間違っている?

ただ、両方の機能がタイプnumber | undefinedを持ちたい明確にします。これは、TypeScriptが、一部の領域で実行されているが復帰していないコードがあることを認識したためです。それは地域がnever地域であることを理解していませんでした。しかし簡単に手助けすることができますが、単にneverを返すだけです。固定コード:

interface Square { 
    kind: "square"; 
    size: number; 
} 

interface Rectangle { 
    kind: "rectangle"; 
    width: number; 
    height: number; 
} 

interface Circle { 
    kind: "circle"; 
    radius: number; 
} 

type Shape = Square | Rectangle | Circle; 

// Type of function: function area1(s: Square | Rectangle | Circle): number 
function area1(s: Shape) { 
    if (s.kind === "square") { 
     return s.size * s.size; 
    } 
    else if (s.kind === "rectangle") { 
     return s.width * s.height; 
    } 
    else if (s.kind === "circle") { 
     return Math.PI * s.radius * s.radius; 
    } 
    else { 
     // Type of s is never 
     const _exhaustiveCheck: never = s; 
     return _exhaustiveCheck; 
    } 
} 

// No Error 
function area2(s: Shape): number { 
    switch (s.kind) { 
     case "square": return s.size * s.size; 
     case "rectangle": return s.width * s.height; 
     case "circle": return Math.PI * s.radius * s.radius; 
     default: 
      const _exhaustiveCheck: never = s; // Type of s is 'never' 
      return _exhaustiveCheck; 
    } 
} 

がPS:私もstrictNullChecksで本を更新しました:https://github.com/basarat/typescript-book/blob/master/docs/types/discriminated-unions.md#strictnullchecks

+0

は一種である、それは面倒な質問が判明したとして、これを答えるためにありがとうございました。私はおそらく何かを台無しにして、この問題を 's'である' Square |最後のブロックの「長方形」を選択します。申し訳ありませんが、次回は問題が残っていて新鮮な表情を見せてから質問を投稿します。私はまたあなたの本の版を読んで、間違った版であることに気付かなかった:-) –