[英]Typescript merge array of different generic types into the same generic type
我有以下類型的數組:
myList = [
listOfString: Parser<string[], string, any>
stringThing: Parser<string, string, any>
]
和 typesript 標記 myList 類型(Parser<string[], string, any> | Parser<string, string, any>)[]
有沒有辦法將其轉換為Parser<string | string[], string, any>
Parser<string | string[], string, any>
默認情況下?
或者,當把它傳遞給一個看起來像的函數時
myFunc<T>(list: Parser<T>[]): Parser<T>
有沒有辦法允許這種類型的數組並使其myFunc
返回Parser<string | string[], string, any>
Parser<string | string[], string, any>
?
有沒有辦法將其轉換為
Parser<string | string[], string, any>
Parser<string | string[], string, any>
[...]?
T<string> | T<string[]>
T<string> | T<string[]>
和T<string | string[]>
T<string | string[]>
在一般情況下不是等效類型。
舉個例子
type T<U> = (u: U) => U;
現在T<string> | T<string[]>
T<string> | T<string[]>
要么是一個接受字符串的函數,要么是一個接受字符串數組的函數。 在任何一種情況下,函數的參數都只是這兩種類型中的一種,並且您只能使用該類型的參數調用它。 如果你(可以)用字符串調用它,你就不能用字符串數組調用它,它也必須返回一個字符串。
另一方面, T<string | string[]>
T<string | string[]>
描述了一個函數,其參數是一個字符串或一個字符串數組,這意味着對於每次調用,您都可以選擇傳遞哪個。 您也可以使用字符串調用它,但該函數返回一個字符串數組。
舉一個具體的例子, (u: string) => u
將滿足第一種類型,但不能分配給第二種:
// OK
const test1: T<string> | T<string[]> = (u: string) => u;
// Error
const test2: T<string | string[]> = (u: string) => u;
同樣, (u: string | string[]) => u
有相反的效果:
// Error
const test3: T<string> | T<string[]> = (u: string | string[]) => u;
// OK
const test4: T<string | string[]> = (u: string | string[]) => u;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.