我编写了一个函数,该函数获取字符串数组并将其转换为T数组:

interface Fooable {
    foo: string;
}

function simplifiedExample<T extends Fooable>(bars: string[]): T[] {
    return bars.map(bar => {
        return {
            foo: bar
        }
    })
}

但是函数第一行中的“bars”一词用红线标记,表示:



我该如何运作?

最佳答案

您需要输入assert来返回Fooable来输入T:

function simplifiedExample<T extends Fooable>(bars: string[]): T[] {
    return bars.map(bar => {
        return {
            foo: bar
        } as T;
    })
}

(code in playground)

原因是T不是Fooable,它只是扩展它,但可能具有其他属性,例如:
interface Mooable extends Fooable {
    moo: string;
}

simplifiedExample<Mooable>(["a", "b", "c"]);

在这种情况下,TMooable,但{ foo: bar }不满足要求,这就是为什么需要键入强制转换的原因。

09-11 20:35