使用 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"]);
在这种情况下,T
是 Mooable
,但 foo: bar
不满足它,这就是您需要键入 cast 的原因。
【讨论】:
我看到的大多数例子都使用强制转换而不是as
,例如return <T> 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) 返回一个通用数组的主要内容,如果未能解决你的问题,请参考以下文章
巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合
typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数
为啥 parseInt 使用 Array#map 产生 NaN?