我正在使用返回基本类型的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
。
我应该使用/尝试其他模式吗?
答案 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'.