Почему TypeScript Guard типа In не сужает типы до ключевых типов? - PullRequest
1 голос
/ 07 января 2020

Рассмотрим этот код:

const obj = {
    a: 1,
    b: 2
}

let possibleKey: string = 'a'

if (possibleKey in obj) console.log(obj[possibleKey])

Когда possibleKey in obj истинно, мы знаем, что possibleKey имеет тип keyof typeof obj, верно? Почему система типов TypeScript не обнаруживает это и не сужает string к этому типу? Вместо этого он говорит:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; b: number; }'.

1 Ответ

4 голосов
/ 07 января 2020

Per документы :

Для выражения n in x, где n - строковый литерал или строковый литерал, а x - тип объединения, «истинная» ветвь сужается до типов, имеющих необязательное или обязательное свойство n, а «ложная» ветвь сужается до типов, имеющих необязательное или отсутствующее свойство n.

В других слова n in x сужают x, а не n и только для строковых литералов или строковых литеральных типов in объединяющих типов. Чтобы это выражение работало, вам нужно предоставить компилятору больше информации, например, используя утверждение типа :

if (possibleKey in obj) {
  console.log(obj[<keyof typeof obj>possibleKey]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...