簡體   English   中英

TypeScript 可區分聯合 - 在詳盡的 If 語句之后分配之前使用的變量

[英]TypeScript Discriminated Union - Variable Used Before Assigned after Exhaustive If Statements

我正在使用 TypeScript 的可區分聯合功能編寫一些代碼。 我正在詳盡地檢查if-else if結構中每種類型的“類型”屬性,並使用每個塊中的邏輯分配一個變量。 然后,我返回變量。 但是,我收到關於在分配之前使用的返回變量的錯誤。 代碼遵循這種結構(這是一個非常簡單的示例來演示問題,因為我的實際代碼要復雜得多):

interface One
{
  num   : "one";
  value : string;
}

interface Two
{
  num   : "two";
  value : number;
}

interface SomeComplexObject
{
  // Complex properties
}

type Num  = One | Two;

function isOne(
  obj : Num
) : SomeComplexObject
{
  let complex : SomeComplexObject;

  if (obj.num === "one")
  {
    // Create a complex object with one set of parameters
  }
  else if (obj.num === "two")
  {
    // Create a complex object with a second set of parameters
  }

  return complex;
}

我的第一個想法是添加一個 final else來拋出一個錯誤,說(在這種情況下) num的值是無效的,但是由於其他條件是詳盡的,所以obj的類型是never並且不能使用。

我可以拋出一個超級通用的錯誤並完成它,但我想知道為什么編譯器認為complex可能是未定義的,但同時認識到條件是詳盡的。 有什么我想念的嗎?

編輯:我原來的例子似乎引起了一些混亂。 我對其進行了更新,希望能更能代表實際問題。

我以兩種方式之一處理這類場景。 通常go用窮舉開關。

interface One {
  num   : "one";
  value : string;
}

interface Two {
  num   : "two";
  value : number;
}

interface SomeComplexObject {
  // Complex properties
}

type Num = One | Two;

// Exhaustive Switch
function isOne(obj : Num) : SomeComplexObject {
    let complex: SomeComplexObject;

    switch (obj.num) {
        case "one":
            complex = {};
        case "two":
            complex = {};
    }

    return complex;
}

// Cast obj to any in `never` case
function isOne2(obj : Num) : SomeComplexObject {
    let complex: SomeComplexObject;

    if (obj.num === "one") {
        complex = {};
    } else if (obj.num === "two") {
        complex = {};
    } else {
        throw new Error(`Unknown object type ${(obj as any).num}`)
    }

    return complex;
}

Typescript 游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM