Можно ли сделать составные типы утилит в Typescript? - PullRequest
1 голос
/ 09 апреля 2020

Не знаю, как сформулировать вопрос, потому что я не уверен, что это возможно, или если у него есть лучшая терминология, но вот идея:

Допустим, у вас есть тип утилиты, такой как:

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

Тогда он будет многократно использоваться без ссылки на тип AB C ...

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

1 Ответ

3 голосов
/ 09 апреля 2020

Для примера в вопросе вы можете написать это так, не задавая отдельный тип Unpacker:

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

К сожалению, нет способа «заполнить пробел» в вашем пример, чтобы заставить это работать, все же. Если бы это было возможно, это было бы так, семантически, если не синтаксически:

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

То есть то, что вы хотите, было бы похоже на curry , что возможно для функций, но не для типов.

...