Typescript, сложные объекты и uniontypes - PullRequest
1 голос
/ 14 июня 2019

Я очень новичок в Typescript.До сих пор я неплохо ладил, но сложные объекты, которые я до сих пор не понимаю, так правильно.В настоящее время я пытаюсь декодировать токен с помощью jsonwebtoken.В результате мне нужно специальное поле ( kid ).

Мой код пока:

const decodedToken: string | { [key: string]: any } = jwt.decode(token, {complete: true});

, но теперь у меня действительно есть проблемы с доступом к полю Kid.В ES5 я бы сделал что-то вроде этого decodedToken.kid

Но функция jwt.decode возвращает тип объединения строки и сложного объекта, который я не понимаю.

export function decode(
    token: string,
    options?: DecodeOptions,
): null | { [key: string]: any } | string;

Я понимаювернуть значение следующим образом.Я получаю либо пустую строку, либо объект с несколькими ключами и их значениями типа any.Как я теперь могу получить доступ к объекту kid ?

Любая помощь очень приветствуется

1 Ответ

1 голос
/ 14 июня 2019

Все, что вам нужно сделать, это type-test ваш путь к одному типу:

if (typeof decodedToken === 'string') {
  // Here it's definitely a string
} else {
  // Here it's definitely an object
}

Это то, что вы должны сделать в любом случае (при условии, что сигнатура типа для decode верна), поскольку "somestring".kid не будет выдавать правильный вывод.

Если вы знаете , что это будет только когда-либо возвращать объект (потому что decode - это библиотечная функция, и вы когда-либо будете вставлять только объекты, поэтому вы будете получать только объекты), тогда вы можете сообщить TypeScript вашей уверенности с типом приведением вместо:

const decodedToken = jwt.decode(token, {complete: true}) as { [key: string]: any };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...