TypeScript - 函数返回的扩展类型

时间:2013-11-16 23:21:04

标签: syntax typescript

在我的代码中,我正在使用扩展外部库接口的接口(为了保持类型检查,以及使用TypeScript的全部原因)。一般来说这很有效。

我现在遇到一个问题,来自第三方库的函数返回该基本接口的实例,我需要将它存储在我自己的自定义接口的变量中,并填写剩余的属性。 / p>

包含代码和错误的图片: Code showing the errorsHere is a link to the text version.

显然这个问题可以通过使用duck typing和cast来解决,但这感觉就像它完全击败了TS的点,所以首先我想知道是否有这样做的语法。

我试过了:

return { externalFactory(); extraProperty: '' }; // And with comma instead of semi-colon
return externalFactory(): { extraProperty: '' };
return { extraProperty: '' } extends externalFactory();

但到目前为止,我的猜测都失败了。所以我想知道,有没有一种语法或方法来做没有丢失类型安全检查?

您可能认为扩展这样的对象需要额外生成的代码(如扩展类所做的那样),但最多只能保存原始对象然后添加其他属性,如:

var temp = externalFactory();
temp.extraProperty = '';
return temp;

如果你要分配一个变量,那么甚至不需要那个临时变量。所以这绝对是可能的。

1 个答案:

答案 0 :(得分:2)

这个场景是非常 raison d'être的投射(或'type assertions',我们在TypeScript中称它们):有人给你一个T型的表达式,你真的想要对待它作为T的子类型而不是。

function myTypeFactoryAttempt2() : IMyType {
    var theValue = <IMyType>externalFactory();
    theValue.extraProperty = '';
    return theValue;
}

在这种情况下,你实际上并没有丢失任何类型的安全性,因为第二行的类型断言本身就是类型断言 - 如果你试图编写<number>externalFactory(),你仍会得到一个编译错误,因为断言的类型(number)不是表达式的子类型(IExternalType)。