аргумент type alias'ом для базового типа?
К примеру, необходима функция, которая будет принимать аргумент только данного type alias, но не базового.
type Token = string
const str = 'string'
const token: Token = 'token'
const decode = (token: Token) => ...
// ошибок нет
decode(token)
// ошибок тоже нет, а надо чтобы typescript ругался
decode(str)
В этом случае функция decode будет принимать и базовый тип string, и type alias Token (собственно, на то он и alias по смыслу). Можно решить проблему, использовав intersection базового и литерального типов (выглядит неоч, но с этим можно смириться):
type Token = string & 'Token'
const str = 'string'
const token = 'token' as Token
const decode = (token: Token) => ...
// ошибок нет
decode(token)
// Argument of type '"string"' is not assignable to parameter of type '"Token"'
decode(str)
Проверка типов работает, то, что надо.
Вопрос: как должен выглядеть предикат isToken в таком случае?
const isToken = (token: any): token is Token => ???
элиас сам по себе кроме названия ничего не содержит если нет операцией типа юниона или пересечения он даже с точки зрения компилятора сразу предстает как исходный тип погуглите typescript brand types: будет улучшенная версия того что вы придумали
Обсуждают сегодня