以下代码块在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一样工作? (即不需要界面)
答案 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'不能分配给类型 '数'