Почему {а: никогда} не эквивалентно никогда? - PullRequest
3 голосов
/ 12 апреля 2020

Кажется, что {a: never} должно быть упрощено до never. Это исправит мои проблемы ниже. Есть ли причина, по которой это невозможно?

type A = {tag: 'A', value: number}
type B = {tag: 'B', value: boolean}
type N = {tag: never, value: string}

type Ntag = N["tag"] // never
type Nvalue = N["value"] // string
// Couldn't N["value"] be simplified to never because an object of type N could never exist?
// And thus, couldn't N be simplified to never?

type AN = A | N
type ANtag = AN["tag"] // "A"
type ANvalue = AN["value"] // Expected: number, Actual: string | number
// AN has to be an A, an object of type N can't exist. So why can't AN["value"] be simplified to number?

type AB = A | B
type NarrowToA = AB & {tag: 'A'} // Expected A, Actual: (A & {tag: "A"}) | (B & {tag: "A"})
type NarrowToATag = NarrowToA["tag"] // A
type NarrowToAValue = NarrowToA["value"] // Expected number, Actual number | boolean
// Again, NarrowToA has to be an A, an object of type B would never fit. So why can't NarrowToA["value"] be simplified to number?

Playground Link

1 Ответ

2 голосов
/ 13 апреля 2020

Спасибо за ваш комментарий @zerkms! Это заставило меня понять, что следующее является допустимым значением типа N. Таким образом, возможно существование объекта со свойством типа never.

type N = {tag: never, value: string}

const n: N = {
    get tag(): never {
        while (true) {}
    },

    value: 'hi'
}

const nTag = n.tag; // Type: never
const nValue = n.value; // Type: string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...