type = interface1 или interface2, не может заставить его работать - PullRequest
1 голос
/ 03 апреля 2020

Извините, если этот вопрос уже задавался, но я вижу только "в чем разница между интерфейсом и типом".

Так что моя проблема в том, что я создал тип, который говорит, что это может быть один объект / интерфейс или другой. Функция получает параметры с этим типом, и это создает проблему типа. Это нелегко объяснить, поэтому код будет лучше: go на Typescript Playground .

Я не понимаю, почему моя переменная недоступна с этим условием, я даже пытался использовать охрану типа, но я не могу заставить его работать.

type Params = {
    a: string;
} | {
    b: string;
    c: number;
}

function test(params: Params) {
    if (params.a !== undefined) {
        console.log("I want to use a there", params.a)
    } else {
        console.log("otherwise it mean b and c are available", params.b, params.c)
    }
}

test({ a: "ok" })
test({ b : "ok", c : 1337 })

Спасибо заранее;)

1 Ответ

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

Вам нужно использовать охрану типа для сужения типа. Это потому, что из вашего типа объединения Params возможно, что params.a на самом деле не существует и даже недоступен. Вы обнаружите, что попытки доступа к params.b или params.c приведут к точно такой же ошибке.

Защита типа должна быть 'a' in params, чтобы TypeScript мог автоматически сужать тип на params и сделайте вывод, что если это условие выполнено, то params должно быть типа { a: string }, в противном случае оно должно быть типа { b: string; c: number; }:

function test(params: Params) {
    if ('a' in params) {
        console.log("I want to use a there", params.a)
    } else {
        console.log("otherwise it mean b and c are available", params.b, params.c)
    }
}

См. подтверждение концепции пример на TypeScript Playground .


TypeScript поддерживает 3 различных типа защиты типов:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...