gpt4 book ai didi

typescript - TypeScript 有没有办法推断对象的类型/this?

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:10 24 4
gpt4 key购买 nike

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

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

o.foo();

如果我为对象创建一个接口(interface),我可以让它失败:

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

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

o.foo();

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

最佳答案

它最终推断出 o 的类型,只是在 o 完全初始化之前它无法做到这一点。在这个例子中,它只为第二个赋值给出了期望的错误:

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


o.x = 'b';

z.ts(7,1): error TS2322: Type 'string' is not assignable to type 'number'.

如果您尝试显式使用 typeof o 作为 this 类型,结果会令人惊讶:

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


o.x = 'b';

没有错误。但为什么?为了便于解释,请尝试使用 --noImplicitAny 编译相同的代码:

z.ts(1,5): error TS7022: 'o' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.

所以我通过“在它自己的初始化程序中直接或间接引用它”使情况变得更糟。

唯一的解决方法似乎是在 o 对象之外定义 foo 函数。幸运的是,typescript 可以在定义 o 之前引用 typeof o:

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

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

o.foo();

t.ts(1,32): error TS2322: Type 'string' is not assignable to type 'number'.

关于typescript - TypeScript 有没有办法推断对象的类型/this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40187898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com