联合类型:Typescript抱怨“函数缺少结尾的return语句,并且返回类型不包含'undefined'。(2366)”

时间:2020-03-24 15:31:14

标签: typescript union-types

这是我的代码。我有一个联合类型CellType。我认为该函数永远不会以null,nothing,undefined或simular调用。

我不想拥有任何else子句或最终的return语句,因为我知道所有情况都已处理。但是我不知所措。我玩过国旗。我得到警告

对于返回值CellType,“函数缺少结尾的return语句,并且返回类型不包括'undefined'。(2366)”

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 个答案:

答案 0 :(得分:1)

您想要的是打字稿,知道您已经涵盖了每种情况;这称为“穷举检查”,它是covered in the TypeScript docs

文档建议您选择以下两种方法之一:

第一个方法是使用--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时尚未涵盖所有可能的情况,这将给您带来编译错误。