是否可以在Typescript中制作可组合的实用程序类型?

时间:2020-04-09 02:03:44

标签: typescript typescript-generics

Dunno如何用这个短语表达问题,因为我不确定这是什么可能性,或者它是否具有更好的术语,但这是一个主意:

假设您的实用工具类型为:

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

1 个答案:

答案 0 :(得分:3)

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

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

但是,不幸的是,您无法在示例中“填空”以使其生效。如果可能的话,必须在语义上(如果不是在语法上)是这样的:

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

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