Типы объединения: Typescript жалуется: «В функции отсутствует завершающий оператор return, а тип возврата не включает« undefined ». (2366)» - PullRequest
0 голосов
/ 24 марта 2020

Это мой код. У меня есть тип соединения CellType. Я предполагаю, что функция никогда не будет вызываться с нулем, ничем, неопределенным или симулированным.

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

«В функции отсутствует конечный оператор возврата, а тип возврата не включает« неопределенное ». (2366)» для возвращаемого значения CellType

class Empty {
};

class MyError  {
    type!: number;
}

type CellType = number | string | boolean | Empty | MyError;

function plusOne(v: CellType): CellType {
    if (typeof v === 'number') {
        return v+1;
    }
    if (typeof v === 'string') {
        return -1;
    }
    if (typeof v === 'boolean') {
        return -1;
    }        
    if (v instanceof Empty) { return 1; }
    if (v instanceof MyError) { return v; }
    // return { 'type':-1}
}

console.log(plusOne(10));
console.log(plusOne("hej"));

Playground Link

1 Ответ

1 голос
/ 24 марта 2020

То, что вы хотите, чтобы машинопись знала, что вы рассмотрели каждый случай; это называется «проверка полноты», и она описана в документах TypeScript .

. В документах рекомендуется выбрать один из двух подходов:

Первый - это скомпилировать с --strictNullChecks и убедитесь, что каждая функция, для которой требуется полная проверка, помечена явным типом возврата. На практике это не практично для большинства кодовых баз.

Второе - добавить небольшую функцию в библиотеку, которая называется assertNever:

function assertNever(x: never): never {
    throw new Error("Unexpected object: " + x);
}

Затем в своем коде используйте assertNever, чтобы указать, что все возможные случаи должны были быть охвачено, например, так:

function plusOne(v: CellType): CellType {
    if (typeof v === 'number') {
        return v+1;
    }
    if (typeof v === 'string') {
        return -1;
    }
    if (typeof v === 'boolean') {
        return -1;
    }        
    if (v instanceof Empty) { return 1; }
    if (v instanceof MyError) { return v; }
    return assertNever(v);
}

Это даст вам ошибку компиляции, если вы не охватили все возможные случаи к моменту достижения assertNever.

...