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

Posted

技术标签:

【中文标题】使用 Array.map (TypeScript) 返回一个通用数组【英文标题】:Returning a generic array using 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”。

我怎样才能让它工作?

【问题讨论】:

【参考方案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 语法,所以我总是使用它

以上是关于使用 Array.map (TypeScript) 返回一个通用数组的主要内容,如果未能解决你的问题,请参考以下文章

typescript array.map 丢失返回类型

巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合

typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数

为啥 parseInt 使用 Array#map 产生 NaN?

React:使用 array.find 和 array.map 方法设置状态有啥区别? [复制]

如何根据循环内的特定条件使用 Array.map 迭代停止索引计数增量?