在我的代码中,我正在使用扩展外部库接口(interface)的接口(interface)(为了保持类型检查,这也是使用 TypeScript 的全部原因)。一般来说,这效果很好。
我现在遇到了一个问题,第三方库中的函数返回该基本接口(interface)的实例,我需要将其存储在我自己的自定义接口(interface)的变量中,并填写其余属性。
带有代码和错误的图像: (Here is a link to the text version.)
显然这个问题可以通过使用鸭子类型和转换来解决,但这感觉就像它完全违背了 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;
如果您要分配给一个变量,则甚至不需要该临时变量。所以这绝对是可能的。
最佳答案
这种情况正是强制转换(或者我们在 TypeScript 中称之为“类型断言”)的根本原因:有人给你一个 T 类型的表达式,而你实际上想要处理它作为 T 的子类型。
function myTypeFactoryAttempt2() : IMyType {
var theValue = <IMyType>externalFactory();
theValue.extraProperty = '';
return theValue;
}
在这种情况下,您实际上并没有失去任何类型安全性,因为第二行上的类型断言本身已进行类型检查 - 如果您尝试编写 <number>externalFactory()
,您仍然会收到编译错误,因为断言类型(数字)不是表达式 (IExternalType) 的子类型。
关于syntax - TypeScript - 扩展函数返回的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025196/