![](/img/trans.png)
[英]How do I implement a generic polymorphism to print the length? That's what they asked me to do
[英]How do I assert a generic array's type at compile time?
function concat<T extends string | Buffer>(input: T[]): T | null {
let input0 = input[0];
switch (typeof input0) {
case "undefined":
return null;
case "string":
return input.join("");
}
return Buffer.concat(input);
}
AFAIK上述切換案例(類似於此處的解決方案)將在運行時完成工作,但是我的IDE抱怨最后兩個return語句。
例如, input instanceof Buffer[]
不能正常工作。
我使用的是字符串或數字數組的簡化示例。 順便說一句, (string | number)[]
和string[] | number[]
之間有細微差別string[] | number[]
string[] | number[]
-后者是相同類型的元素的數組,前者是可能包含兩者的數組。 我提供了兩個示例,因為它們適合不同的用例(請注意,我期待其他人將來在找到您的問題時會做些什么)。
我簡化了該示例,因為我只能猜測Buffer
實現,並且因為簡單版本遇到了與原始代碼完全相同的問題。
這個處理混合數組,即每個元素可以是字符串或數字。
本示例采用輸入數組,並依次檢查每個項目,將其分為字符串和數字。
const strings: string[] =[];
const numbers: number[] = [];
function example(input: (string | number)[]) {
const [first, ...others] = input;
if (typeof first === 'string') {
strings.push(first);
} else {
numbers.push(first);
}
example(others);
}
這處理包含單個類型(所有字符串或所有數字)的數組。
在此示例中,我們使用類型斷言來告訴編譯器,如果第一項是字符串,則它們都是字符串。
function example(input: string[] | number[]) {
const first = input[0];
if (typeof first === 'string') {
return (<string[]>input).join('');
} else {
return (<number[]>input).map((n) => n.toString()).join('');
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.