如何在Typescript中键入转换元组的函数
可以在Typescript中编写这样的函数吗如何在Typescript中键入转换元组的函数,typescript,Typescript,可以在Typescript中编写这样的函数吗 type Boxed<T> = { value: T }; function unbox<T>(box: Boxed<T>): T { return box.value; } function unboxTuple<T extends Boxed<unknown>[]>( ...tuple: T ) { return tuple.map(unbox); } co
type Boxed<T> = { value: T };
function unbox<T>(box: Boxed<T>): T {
return box.value;
}
function unboxTuple<T extends Boxed<unknown>[]>(
...tuple: T
) {
return tuple.map(unbox);
}
const boxedTuple: [Boxed<number>, Boxed<string>] = [
{value: 4}, {value: "foo"}
];
type-Boxed={value:T};
函数unbox(框:已装箱):T{
返回框.value;
}
函数无结构(
…元组:T
) {
返回tuple.map(unbox);
}
常量boxedTuple:[已装箱,已装箱]=[
{value:4},{value:foo}
];
我觉得这应该是可能的,但此代码不起作用:您可以更改此代码:
函数取消组合(
元组:T
) {
返回tuple.map(unbox);
}
或者这个:
console.log(unboxTuple(...boxedTuple));
要获取适当的类型,需要使用元组上的映射类型从框中提取每个类型:
type UnboxAll<T extends Record<number, Boxed<any>>> = {
[P in keyof T]: T[P] extends Boxed<infer V> ? V : never
};
function unboxTuple<T extends Boxed<unknown>[]>(
...tuple: T
) {
return tuple.map(unbox) as UnboxAll<T>
}
const boxedTuple: [Boxed<number>, Boxed<string>] = [
{ value: 4 }, { value: "foo" }
];
let z = unboxTuple(...boxedTuple); // [number, string]
)
键入UnboxAll