TypeScript有没有办法推断出对象的类型/类型?

时间:2016-10-22 03:00:59

标签: typescript

以下代码块在TypeScript中是合法的,但在Flow中不合法:

var o = {
  x: 1,
  foo() { this.x = 'a'; }
};

o.foo();

如果我为对象创建一个接口,我可以使它失败:

interface Obj {
    x: number;
    foo(this: Obj): void;
}

var o = {
  x: 1,
  foo(this: Obj) { this.x = 'a'; }
};

o.foo();

是否有TypeScript编译选项使其像Flow一样工作? (即不需要界面)

1 个答案:

答案 0 :(得分:0)

它最终推断出o的类型,直到o完全初始化为止,它才能做到这一点。在此示例中,它仅为第二个赋值提供所需的错误:

var o = {
    x: 1,
    foo() { this.x = 'a'; }
};


o.x = 'b';
  

z.ts(7,1):错误TS2322:输入' string'不能分配给类型   '数'

如果您尝试明确并使用typeof o进行this类型,结果会令人惊讶:

var o = {
    x: 1,
    foo(this: typeof o) { this.x = 'a'; }
};


o.x = 'b';

没有错误。但为什么?有关解释,请尝试使用--noImplicitAny:

编译相同的代码
  

z.ts(1,5):错误TS7022:' o'隐含地具有类型' any'因为它确实如此   没有类型注释,直接或间接引用   它自己的初始化器。

所以我通过"直接或间接地在它自己的初始化程序中引用它来#34;。

围绕它的唯一方法似乎是在foo对象之外定义o函数。幸运的是,在定义typeof o之前引用o,打字稿是可以的:

function foo(this: typeof o) { this.x = 'a'; }

var o = {
    x: 1,
    foo: foo
};

o.foo();
  

t.ts(1,32):错误TS2322:输入' string'不能分配给类型   '数'