AsExpression从类型中删除未定义的未定义比我想要的更积极

时间:2017-11-10 20:29:27

标签: typescript

我正在使用返回基本类型的API。我使用as关键字将类型强制转换为该基类型的两个子类型的并集。

interface base { a: number; }
interface sub1 extends base { s1: number; }
interface sub2 extends base { s2: number; }
interface sub3 extends base { s3: number; }

declare function returns1or2(): base;

const x = returns1or2() as sub1 | sub2;

console.log(x.a);

这很好/很好,我想要的。

我在这里使用AsExpression的“问题”是API的声明随着它的增长而变化--strictNullChecks - 真棒,有人可能会将它的返回类型更改为:

declare function returns1or2(): base | undefined;

const x = returns1or2() as sub1 | sub2;

console.log(x.a);  // now a run-time error (in some situations)

这对我(API使用者)来说从未显示为编译时错误,让我害怕使用AsExpression

我应该使用/尝试其他模式吗?

1 个答案:

答案 0 :(得分:1)

与往常一样,可以通过添加间接级别来解决。您可以定义自己的演员函数,但不接受undefined

interface base { a: number; }
interface sub1 extends base { s1: number; }
interface sub2 extends base { s2: number; }
interface sub3 extends base { s3: number; }

declare function returns1or2(): base | undefined;

function castFromTo<From, To extends From>(from: From): To { return from as To };


const x = castFromTo<base, sub1 | sub2>(returns1or2());//error with strictNullChecks 
//Argument of type 'base | undefined' is not assignable to parameter of type 'base'
//      Type 'undefined' is not assignable to type 'base'.