为什么在窗口对象之前加上前缀“ <any>”?

时间:2019-10-14 14:05:09

标签: javascript typescript

我是打字机的新手,我看到了一本书,其中包含以下内容:

(<any>window).model= ...;

我很困惑,在变量前添加<any>的语法名称是什么?这样做有什么好处?

3 个答案:

答案 0 :(得分:1)

那是type assertion。您要告诉编译器使用与它认为的类型不同的类型。

答案 1 :(得分:0)

使用这样的类型断言时,您基本上是在告诉编译器“嘿,编译器我知道我在做什么,放松一下。”有时您必须这样做才能在对象上设置新属性,例如,我假设如果您只是window.model,编译器会抱怨说model不是...的属性。 window

仅在确实需要这样做时才建议这样做,因为一切都使用any与根本不使用TypeScript相同。因此,无论何时决定断言类型,都应谨慎行事。

奖金信息:

您还可以编写window as any,在我看来,它更具可读性和可读性。

答案 2 :(得分:0)

因为model在Window界面中不存在: https://github.com/microsoft/TypeScript/blob/v3.6.4/lib/lib.dom.d.ts#L18500

您可以访问window.documentwindow.addEventListener()

因此,您要告诉编译器“让窗口对象成为任何事物”。

没有强制转换,编译器会说Property 'model' does not exist on type 'Window & typeof globalThis'.

另一个例子:

interface Person {
    age: number;
    name: string
}

let michael: Person = {
   age: 28,
   name: 'Michael'
};

michael.age++;
(<any>michael).hasDogs = true; // hasDogs is not a property of Person, so cast michael to be anything

您可以在这里进行测试:https://www.typescriptlang.org/play/#code/O4SwdgJg9sB0C2UIFMA2ACAvOg5ACzVRhwG4g