如何避免在扩展函数或数组的类型上丢失属性TypeScript错误

时间:2016-02-06 22:32:32

标签: typescript

当我定义一个从函数或数组扩展的接口时,我没有找到一种方法来正确创建新实例而不会出现错误或使用any强制转换。

有没有办法在没有恢复黑客的情况下初始化这些成员?

功能示例:

interface Foo {
    bar: any;
    (): void;
}

// how to create a Foo?
var foo: Foo;
foo = () => {}; // cannot convert type ... has non-optional property bar which is not present
foo.bar = "initialized!";

数组示例:

interface Foo<T> extends Array<T> {
    bar: any;
}

// how to create a Foo?
var foo: Foo<any>;
foo = []; // cannot convert type ... has non-optional property bar which is not present
foo.bar = "initialized!";

2 个答案:

答案 0 :(得分:6)

也许您正在寻找可选的运算符

interface Foo<T> extends Array<T> {
  bar?: any;
}

var foo: Foo<any>;
foo = []; // No error

?放置在属性名称之后但:之前使该属性可选。这意味着该财产不一定存在,但可以。

<强>更新

如果执行希望合同要求提供该属性,那么需要进行转换。这是因为TypeScript要求使用文字([]{})实例化的所有对象都包含所有必需成员。在不使用包含必需属性的情况下实例化此的正确方法是使用强制转换。 foo = <any>[];foo = <Foo><any>[];

答案 1 :(得分:0)

回答我自己的问题,因为我在此期间找到了解决方法...

使用 Object.assign() 效果很好。

interface Foo {
    bar: any;
    (): void;
}

var foo: Foo = Object.assign(
    function() {}, 
    { bar: "initialized!" });

interface Foo<T> extends Array<T> {
    bar: any;
}

var foo: Foo<any> = Object.assign(
    [],
    { bar: "initialized!" });