gpt4 book ai didi

typescript - 在不同数组类型的联合上使用数组方法(例如 map),而无需强制转换为 any[] 或 []

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:44 24 4
gpt4 key购买 nike

我有一个函数接受两个或多个数组类型的并集。例如。

type MyArray = string[] | number[];

const someFunc = (array: MyArray) => array.map(x => x.toString());

这是错误信息:

Cannot invoke an expression whose type lacks a call signature.
Type '
<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[] |
<U>(callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[]
'
has no compatible call signatures.

问题:

  1. 错误信息中的表达式是什么?
  2. expression 的类型是什么?
  3. 我们如何指定该表达式的类型?

这是我试过的:

const someFunc01 = (array: MyArray) =>
(array as any[]).map(x => x.toString());

const someFunc02 = <T extends MyArray, U extends T[number]>(array: U[]) =>
array.map(x => x.toString());

const someFunc03 = (array: MyArray) =>
(array as []).map(x => x.toString());

要清楚,这些是用例:

someFunc01([10, 20, 30]); // must compile
someFunc01(['foo', 'bar', 'baz']); // must compile
someFunc01(['foo', 10, 'baz']); // must not compile

最佳答案

What is the expression in the error message?

它是 array.map,您尝试为 someFunc 中的 array 参数调用的数组方法

What is the type of the expression?

它是两种类型的联合,一种用于string[]数组中的map(),另一种用于map()中的number[] 数组

How can we specify the type of that expression?

type E = (string[] | number[])['map'];

playground popup 中给出此类型

type E = (<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[])

这是 TypeScript 中长期存在的问题 - 它不允许在联合类型上调用方法,即使联合中的所有成员都具有名称相同但签名不同但适当的方法。

现在,你必须像这样在实现中使用类型断言

type StringOrNumberArrayMap = (string | number)[]['map'];

const someFunc = (array: MyArray) => (array.map as StringOrNumberArrayMap)(x => x.toString());

它不会影响 someFunc 的接口(interface),您所有的 someFunc 示例都应该按预期编译(或不编译)。

这可能会,也可能不会在编译器的下一个版本(3.3 或更高版本)中得到修复,请参阅 this PR

关于typescript - 在不同数组类型的联合上使用数组方法(例如 map),而无需强制转换为 any[] 或 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53826232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com