TypeScript和点符号访问对象

use*_*321 19 javascript typescript

如果TypeScript是JavaScript的严格超集,为什么任意对象上的点符号都是错误的?我有JS代码,我想转换到TS以获得更好的类型安全性,但所有使用点表示法(例如myObj.thing)的访问都给我错误Property 'thing' does not exist on type '{}'..当我使用括号表示法(例如,myObj['thing'])时,它可以正常工作.

属性在类型上不存在

Dav*_*ret 14

我知道你说这很奇怪,但这是TypeScript存在的主要原因之一.此错误有助于防止在对象上意外设置或获取不存在的属性.

现在,正如编译器告诉你的那样,该属性bar不存在,x因为它{}在写入时已被隐式输入var x = {};.

您可以x通过显式定义类型来告诉编译器具有多于零的属性:

var x: { foo?: string; bar?: string; } = {};
Run Code Online (Sandbox Code Playgroud)

现在你可以得到或设置x.foo并且x.bar没有编译器抱怨.在大多数情况下,您可以将其移动到如下界面:

interface IFooBar {
    foo?: string;
    bar?: string;
}

var x: IFooBar = {};

x.foo = "asdf";  // ok
x.test = "asdf"; // error, as it should be
Run Code Online (Sandbox Code Playgroud)

有些人建议你施展any,但不要偷懒.您应该充分利用TypeScript提供的类型系统.这样做绝对可以节省您在维护应用程序时的时间.