gpt4 book ai didi

typescript - 在 Typescript 中包装可变参数元组类型

转载 作者:行者123 更新时间:2023-12-04 08:54:02 24 4
gpt4 key购买 nike

我想转换一个元组类型 [T1, T1]到其他一些 [T2, T2] ,其中 T2T1 的子类型.到目前为止,这是我最好的尝试,但我无法弄清楚 variadicMapping 上的返回类型.我的猜测是该解决方案涉及新引入的可变参数元组类型。

type T1 = { property: string };
type T2 = T1 & { otherProperty: number };

const transformType = <T extends T1>(obj: T): T2 => ({
...obj,
otherProperty: 0,
});

const variadicMapping = <T extends T1[]>(objects: T) => {
return objects.map((e) => transformType(e));
};

const foo = [{property: 'propertyA' }, { property: 'propertyB' }] as [T1, T1];
const bar = variadicMapping(foo); // T2[] instead of [T2, T2]

最佳答案

为此,您不需要可变参数元组类型。问题在于TypeScript standard library definition for Array.prototype.map() 不试图表示保留数组长度的事实。有一个 Unresolved 问题,microsoft/TypeScript#29841 ,要求解决这个问题。
如果您需要编译器注意长度,则需要使用您自己的输入 map()通过,比如说,declaration merging .可能是这样的:

interface Array<T> {
map<U>(
callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any
): { [K in keyof this]: U };
}
我正在使用 mapped tuple types表示长度保留,特别是 polymorphic this 捕捉我们想要迭代 Array<T> 的任何子类型的键的事实我们碰巧正在使用,例如元组。
但是弄乱这些常用方法的定义可能会在代码库的其他部分产生意想不到的结果,所以除非您想担心是否每次使用 map()应该这样做,你可以使用 type assertion告诉编译器此特定调用的结果 map()具有特定的长度和类型:
const variadicMapping = <T extends T1[]>(objects: T) => {
return objects.map((e) => transformType(e)) as { [K in keyof T]: T2 };
};
无论哪种方式,您都应该获得所需的行为:
const bar = variadicMapping(foo); // [T2, T2]
Playground link to code

关于typescript - 在 Typescript 中包装可变参数元组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63940361/

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