使用Array.map(TypeScript)返回通用数组

Alo*_*lon 6 javascript arrays oop generics typescript

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

interface Fooable {
    foo: string;
}

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

但是函数第一行中的"bars"一词用红线标出,表示:

TS2322:类型'{foo:string;} []'不能赋值为'T []'.类型"{foo:string}"不能分配给"T"类型.

我怎样才能使它工作?

Nit*_*mer 5

您需要键入assert返回Fooable的类型T:

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

(游乐场代码)

原因是,T它不是Fooable,它只是扩展它,但可能有其他属性,例如:

interface Mooable extends Fooable {
    moo: string;
}

simplifiedExample<Mooable>(["a", "b", "c"]);
Run Code Online (Sandbox Code Playgroud)

在这种情况下TMooable,但{ foo: bar }不能满足它,这就是为什么你需要强制类型转换.

  • @TJCrowder 来自 [类型断言](https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions):“这两个样本是等效的。使用一个而不是另一个主要是一种选择偏好;但是,当将 TypeScript 与 JSX 一起使用时,只允许使用 as 样式的断言”。 (2认同)