Подсказка пользовательского типа TypeScript - PullRequest
0 голосов
/ 03 августа 2020

Я хотел бы объявить несколько простых типов, чтобы различать guish строки, такие как «url», «absolute url», «json», et c. Было бы достаточно показать объявленный тип в подсказке, но проверка типов была бы еще лучше (т.е. «url» не мог быть передан функции, ожидающей «абсолютного url»).

Проблема в том, что TypeScript / VS C понимает, что url - это строка, и пропускает объявленный мной тип. Есть ли способ показать объявленный тип в подсказке? Я не против хакерских решений, если они не нарушают функции TypeScript.

Пример кода - я хочу видеть «const data: url» в подсказке:

enter image description here

What I want to see (but this solution is bad, because url shouldn't be a number): введите описание изображения здесь

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Нет гарантии, что псевдонимы ваших типов сохранятся, поскольку машинописный текст не заботится о том, является ли что-то string или url, поскольку они имеют один и тот же базовый тип. Это происходит из-за структурной (в отличие от номинальной) философии набора, принятой в машинописном тексте, хотя есть некоторые предложения для поддержки этого варианта использования (https://github.com/microsoft/TypeScript/pull/33038, https://github.com/microsoft/TypeScript/pull/33290 ).

В то же время лучше всего использовать функцию с таким возвращаемым типом:

working code

As for your other question - different url types - you can achieve something like this using дискриминируемые объединения и добавление свойств к объекту string:

type url = string & { _subtype: 'absoluteUrl' | 'relativeUrl' | 'other' }
type absoluteUrl = url & { _subtype: 'absoluteUrl' }
type relativeUrl = url & { _subtype: 'relativeUrl' }

const createAbsoluteUrl = (input: string) => {
  const createdAbsoluteUrl = input
  ;(createdAbsoluteUrl as any)._subtype = 'absoluteUrl'
  return createdAbsoluteUrl as absoluteUrl
}

const createRelativeUrl = (input: string) => {
  const createdRelativeUrl = input
  ;(createdRelativeUrl as any)._subtype = 'relativeUrl'
  return createdRelativeUrl as relativeUrl
}

const expectAbsoluteUrl = (input: absoluteUrl) => {
  // something
}

const expectRelativeUrl = (input: relativeUrl) => {
  // something
}

После этого вы должны увидеть ошибки типа, как вы и ожидали: enter image description here

You may also find охранники определенного пользователем типа полезно, если вы go с этим подходом

1 голос
/ 03 августа 2020

Решение

Пересечение вашего примитивного типа с пустым типом объекта.

type url = string & {};

Объяснение

Обратите внимание, что {} не означает пустой объект , как вы думаете. Он представляет все, кроме null | undefined. Здесь смешивание string с {} ничего не меняет, но теперь имя будет сохранено.

1 голос
/ 03 августа 2020

Я не нашел способа добиться чего-то, о чем вы просили, используя примитивные типы. Но не возражаете ли вы использовать enum?

Как профессионалы, вы будете иметь свой URL в одном месте.

введите описание изображения здесь

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