在TypeScript中,我们可以使用Tuple类型来创建类型化的命名rest参数。这对于rest参数很有用。
type Params = [myString: string, myNumber: number, mySecondString: string]
const fn = (...args: Params) => null
// Type is (myString: string, myNumber: number, mySecondString: string) => null
当使用Map的元组类型时,有没有什么方法可以达到同样的效果?
type TypeMap = {
"string": string
"number": number
}
const inputs = [
{name: "myString", type: "string"},
{name: "myNumber", type: "number"},
{name: "mySecondString", type: "string"},
] as const
type InputToTuple<T extends typeof inputs> = { [P in keyof T]: TypeMap[T[P]["type"]] };
type Params = InputToTuple<typeof inputs>
const fn = (...args: ParamsIWant) => null
// Type is (args_0: string, args_1: number, args_2: string) => null
当Tuple被创建为Map类型时,是否有方法提供这些参数的 names?
核心就是要搞这一行:
type InputToTuple<T extends typeof inputs> = { [P in keyof T]: TypeMap[T[P]["type"]] };
产生此结果:
type Params = InputToTuple<typeof inputs>
// Type is [myString: string, myNumber: number, mySecondString: string]
这可能吗?
Playground
原因说明:我正在构建一种方法,让TypeScript基于Ethereum JSON ABI推断类型(并使用as const
进行类型收缩)。
1条答案
按热度按时间x7rlezfr1#
对于问题“TypeScript中是否可能存在Map的命名元组成员?”,答案是“是”,使用元组rest语法。
其思想是分别操作标签和值。
在您的情况下,还有一个额外的约束,即事先不知道标签。这是不可能的,您必须建立一个所有可能标签的列表。
运动场
奇迹就发生在这里