Есть ли способ показать нормализованную версию типа в машинописи? - PullRequest
1 голос
/ 13 февраля 2020

Существует множество параметризованных псевдонимов типов, которые используются в машинописном тексте, и иногда бывает трудно определить, какой фактический тип находится ниже всех уровней абстракции. Есть ли способ нормализовать конкретный тип, удалить из него все псевдонимы типов?

Например, если у меня есть эти типы:

type Maybe<T> = T | null
type Num = number
type Base = {
  a: Num
  b: boolean
  c: Maybe<{ x: Num }>
}

type Hello = Pick<Base, 'a' | 'c'>

Я хочу каким-то образом показать, что Hello такой же как:

type Hello = {
  a: number
  c: { x: number } | null
}

Меня также интересует, есть ли способ выполнить поверхностную нормализацию и преобразовать Pick<Base, 'a' | 'c'> в

type Hello = {
  a: Num
  c: Maybe<{ x: Num}>
}

1 Ответ

3 голосов
/ 13 февраля 2020

Поскольку для машинописного текста используется структурная типизация Pick<Base, 'a' | 'c'>, а развернутая версия по сути является одним и тем же типом, написанным по-другому, поэтому я бы не стал расширять тип по каким-либо причинам совместимости.

Если Вы только хотите расширить тип, чтобы проверить это, есть хитрость, чтобы сделать это. Вы можете использовать сопоставленный набранный в пересечении с {}. Это заставит компилятор расширять тип.

Это поведение не задокументировано и не гарантированно будет работать в будущем. Таким образом, вы можете использовать его, но не зависите от него каким-либо значимым образом.

type Maybe<T> = T | null
type Num = number
type Base = {
  a: Num
  b: boolean
  c: Maybe<{ x: Num }>
}

type Hello = Pick<Base, 'a' | 'c'>


type Id<T> = {} & {
  [P in keyof T]: Id<T[P]>
}

type HelloExpand = Id<Hello>
// On hover you can see in the tooltip (pro tip, if you are quick you can copy a tooltip in VSCode and the playground):
// type HelloExpand = {
//     a: number;
//     c: {
//         x: number;
//     } | null;
// }

Playground Link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...