簡體   English   中英

TypeScript 檢查變量是元組還是元組數組

[英]TypeScript check if variable is a tuple or array of tuples

僅出於示例目的給出以下代碼:

type tuple = [key: string, value: number];

function foo(arg: tuple | Array<tuple>) {
  const arr = Array.isArray(arg[0]) ? arg : [arg];
  // The type of arr is: tuple | (tuple | tuple[])[]
  console.log(arr.length);
}

foo(['key', 111]);
foo([['key', 222]]);

我也試過typeof arg[0] === 'string' ? [arg] : arg typeof arg[0] === 'string' ? [arg] : arg但這也會導致相同的結果。 運行代碼有預期的結果,即arr始終是一個元組數組,但 TypeScript 並不“知道”它。

如何讓 typescript 正確地將arr的類型縮小為tuple[]而不明確聲明它?

編譯器只會看到您將arg[arg]分配給arr 它不會改變它認為arg的類型基於Array.isArray(arg[0])的內容,因此arr的類型是arg[arg]類型的並集。 arg的類型是tuple | tuple[] tuple | tuple[]所以[arg]的類型是(tuple | tuple[])[] ; 這些類型的聯合簡化為tuple | (tuple | tuple[])[] tuple | (tuple | tuple[])[]因為tuple[](tuple | tuple[])[]的子集。

您可以將Array.isArray包裝在用戶定義的類型保護中,讓編譯器以您想要的方式解釋事物。

function isArrayOfTuples(arg: tuple | tuple[]): arg is tuple[] {
    return Array.isArray(arg[0]);
}

function foo(arg: tuple | tuple[]) {
    const arr: tuple[] = isArrayOfTuples(arg) ? arg : [arg];
    console.log(arr.length);
}

否則,我認為您必須明確聲明類型才能執行此操作。

const arr: tuple[] = Array.isArray(arg[0]) ? arg as tuple[] : [arg] as tuple[];

通常可能更容易實現的另一個選項是將arg的類型更改為tuple[] 想要傳遞單個tuple的調用者可以將參數包裝在一個數組中。

暫無
暫無

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

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