Никогда не используйте тип с реализациями интерфейса / класса в Typescript - PullRequest
0 голосов
/ 02 ноября 2018

Я бы хотел использовать тип машинного ввода никогда , чтобы убедиться, что я проверил все возможные реализации интерфейса. Вот код:

interface MyInterface {
    a: string;
    b: number;
}

class MyClass1 implements MyInterface {
    a: string;
    b: number;

    constructor() { }
}

class MyClass2 implements MyInterface {
    a: string;
    b: number;

    constructor() { }
}

function foo(arg: MyInterface) {
    if (arg instanceof MyClass1) {

    } else if (arg instanceof MyClass2) {

    } else {
        assertNever(arg);
    }
}

function assertNever(value: never): never {
  throw Error(`Unexpected value '${value}'`);
}

Но я получил ошибку: аргумент типа 'MyInterface' не может быть назначен параметру типа 'never'.

Есть идеи, если есть способ это исправить?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать подход assertNever, чтобы убедиться, что все случаи обрабатываются (что, я думаю, вы хотите сделать). Проблема в том, что вам нужно объединить все возможности, а не использовать интерфейс. Typescript не может знать, какими будут все реализации интерфейса, так что ваш type-guard не сузит тип параметра.

Это будет работать так, как вы ожидаете:

function foo(arg: MyClass1 | MyClass2) {
    if (arg instanceof MyClass1) {

    } else if (arg instanceof MyClass2) {

    } else {
        assertNever(arg);
    }
}
0 голосов
/ 02 ноября 2018

Я думаю, вы никогда не понимаете.

Из документов

Тип never является подтипом и присваивается каждому типу; однако ни один тип не является подтипом или не может быть назначен никогда (кроме самого себя). Даже ни один не может быть назначен никогда.

Вы не можете присвоить значения never Поскольку ваше объявление типа assertNever(value: never) При присвоении ему переменной при вызове assertNever(arg);

будет выдано сообщение об ошибке.

Простое изменение его на assertNever(value: any): never исправит ошибку. (Или более конкретный тип, если хотите)

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