2016-06-27 54 views
4

我想通过添加一些新字段来扩展TypeScript中的数据对象。虽然我猜这是JavaScript中很常见的模式,但我无法使其能够编译,而不会使bar在代码片段中成为可选项,如下所示。在TypeScript中扩展数据对象

我想知道有什么办法可以避免使bar可选。 任何建议将受到欢迎,谢谢。

interface BaseDataObject { 
    foo: string; 
} 

interface ExtendedDataObject extends BaseDataObject { 
    bar?: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output : ExtendedDataObject = input; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

回答

4

您可以通过编译时铸造inputExtendedDataObject做到这一点,而不是仅仅将其分配给output

interface ExtendedDataObject extends BaseDataObject { 
    bar: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output = input as ExtendedDataObject; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

这种类型的演员的正式名称type assertion,它告诉编译器信任你该对象可以视为您指示的类型。

+0

看来这是避免它的唯一方法。 – choz

+0

它的工作原理,谢谢。我假设编译时间检查丢失的字段被绕过,对吧? – Haocheng

+1

@Haocheng对,这被正式称为[类型断言](https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html),它告诉编译器相信你,对象可以视为您指定的类型。 – JohnnyHK