不是真的。无法以任何可预测或可用的顺序枚举对象的键。您可以以编程方式进行一些事情,但您必须从更容易操作的类型开始,如下所示:
type MySchema = [['foo', number], ['bar', string]]
这是一个 2 元组的元组,表示您的类型中的键值对。然后您可以使用(TSv2.8 及更高版本)类型函数合成MyType,例如:
type MakeMyType<S extends [string, any][], M = S[number]> =
{ [K in S[number][0]]: M extends [K, any] ? M[1] : never }
您可以验证:
type MyType = MakeMyType<MySchema>
// inspects as { foo: number; bar: string }
然后你可以合成MyTypeFn 使用类型函数,例如:
type MakeMyFunction<S extends [string, any][], L = S['length'], T = MakeMyType<S>> =
L extends 0 ? () => T :
L extends 1 ? (a0: S[0][1]) => T :
L extends 2 ? (a0: S[0][1], a1: S[1][1]) => T :
L extends 3 ? (a0: S[0][1], a1: S[1][1], a2: S[2][1]) => T :
L extends 4 ? (a0: S[0][1], a1: S[1][1], a2: S[2][1], a3: S[3][1]) => T :
L extends 5 ? (a0: S[0][1], a1: S[1][1], a2: S[2][1], a3: S[3][1], a4: S[4][1]) => T :
L extends 6 ? (a0: S[0][1], a1: S[1][1], a2: S[2][1], a3: S[3][1], a4: S[4][1], a5: S[5][1]) => T :
(...args: S[number][1][]) => T
请注意,没有编程方式来处理可变长度参数列表,因此您能做的最好的事情就是使案例达到上述某个固定的最大长度。让我们验证一下:
type MyTypeFn = MakeMyFunction<MySchema>
// inspects as (a0: number, a1: string) => { foo: number; bar: string; }
是的,参数名称也丢失了(foo 和 bar 变为 a0 和 a1)。这不会影响函数签名的类型兼容性,其中参数名称并不重要。但我猜你想要这些参数名称在使用或实现函数时进行提示。如果是这样,那就是另一个“不是真的”。
所以说“不是真的”多次是一种冗长的方式。哦,好吧,无论如何,也许它有一些帮助。祝你好运!