【问题标题】:Returning a generic array using Array.map (TypeScript)使用 Array.map (TypeScript) 返回一个通用数组
【发布时间】:2017-05-16 10:14:14
【问题描述】:

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

interface Fooable {
    foo: string;
}

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

但是函数第一行的“bars”这个词用红线标出来,说:

TS2322:类型“{foo:string;}[]”不可分配给类型“T[]”。类型“{foo:string}”不可分配给类型“T”。

我怎样才能让它工作?

【问题讨论】:

    标签: javascript arrays oop generics typescript


    【解决方案1】:

    您需要将返回的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 } 不满足它,这就是您需要键入 cast 的原因。

    【讨论】:

    • 我看到的大多数例子都使用强制转换而不是as,例如return &lt;T&gt;{ foo: bar}; 而不是 return {foo: bar} as T; 有区别吗?如果是这样,是否有充分的理由选择as 而不是演员?还是它们只是做同一件事的两种方式?
    • @TJCrowder 来自Type assertions:“这两个示例是等价的。使用一个而不是另一个主要是一种偏好选择;但是,当使用带有 JSX 的 TypeScript 时,只允许 as 样式的断言"。
    • 谢谢!我踢了一圈,但找不到。所以as 语法更加灵活(无论你是否使用 JSX 都可以使用),而如果你使用 JSX,则不能使用强制转换语法。
    • @T.J.Crowder 对。因为我使用的是TSX,所以我已经习惯了as 语法,所以我总是使用它
    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2019-05-21
    • 2019-09-09
    • 1970-01-01
    • 2020-08-19
    • 2018-06-18
    • 2016-10-29
    • 2018-04-08
    相关资源
    最近更新 更多