Это можно сделать, приложив некоторые усилия.
Хитрость заключается в том, чтобы определить ваше ProductID
как нечто, находящееся в TS, отличное от номера, но все же число, когда на самом деле работает как Javascript .
Я написал об этом в своем блоге здесь: https://evertpot.com/opaque-ts-types/
Но я поделюсь важными деталями здесь:
declare const validProductId: unique symbol;
type ProductId = number & {
[validProductId]: true
}
Примечание что даже если мы объявили «уникальный символ», он полностью удален из Javascript, так что на самом деле ProductId
символ * добавлен к вашему *1016*, что было бы больно.
Чтобы на самом деле получить что-то, распознаваемое как ProductId
, вам нужно написать либо функцию подтверждения, либо функцию защиты типа, либо просто приведение из того места, где ProductId
фактически разрешено генерировать.
И, повторюсь, нет необходимости добавлять этот символ к вашему ProductId
, это просто , чтобы убедиться, что Typescript распознает ProductId
как отличный от number
тип. Во время выполнения это просто number
.
Это шаблон great для вашего варианта использования. По сути, это показатель того, что это не просто число, а число, проверенное вашей бизнес-логикой c как идентификатор продукта.