1

不知道如何表达这个问题,因为我不确定什么是可能的,或者它是否有更好的术语,但这是这个想法:

假设您有一个实用程序类型,例如:

type Unpack<T, K> = K extends keyof T ? T[K] : never;
// ☝️ gets a nested type from a given object type/interface

以及您使用它的类型或接口,例如:

type ABC = { a: string, b: boolean, c: number }

使用该实用程序很容易创建新类型:

type TypeofA = Unpack<ABC, 'a'>
// ☝️ TypeofA = string

但是我们可以用已经注入的类型编写一个实用程序吗?

type Unpacker<T> = unknown // <- what goes here? ‍♂️
type UnpackABC = Unpacker<ABC> // <- to use like this

然后它可以在不引用 ABC 类型的情况下重复使用......

type A = UnpackABC<'a'> // string
type B = UnpackABC<'b'> // boolean
type C = UnpackABC<'c'> // number
4

1 回答 1

3

对于问题中的示例,您可以这样编写,而无需定义单独的Unpacker类型:

type UnpackABC<K> = Unpack<ABC, K>

不幸的是,没有办法在您的示例中“填补空白”以使其正常工作。如果可能的话,它必须是这样的,语义上如果不是句法上:

type Unpacker<T><K> = Unpack<T, K>

也就是说,您想要的就像currying一样,这对于函数是可能的,但对于类型是不可能的。

于 2020-04-09T02:21:34.063 回答