簡體   English   中英

如何在編譯時聲明通用數組的類型?

[英]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.

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