![](/img/trans.png)
[英]Javascript check if first element of tuple exists in array of tuples
[英]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.