对象字面量的惰性初始化
但在 TypeScript 中,同样的写法就会报错:
foo.bar = 123; // Error: Property 'bar' does not exist on type '{}'
foo.bas = 'Hello World'; // Error: Property 'bas' does not exist on type '{}'
这是因为 TypeScript 在解析 let foo = {}
这段赋值语句时,会进行“类型推断”:它会认为等号左边 foo
的类型即为等号右边 {}
的类型。由于 {}
本没有任何属性,因此,像上面那样给 foo
添加属性时就会报错。
这种写法也比较容易通过其他人或工具的代码审核,对后期维护也是有利的。
如果你的 JavaScript 项目很大,那么在迁移到 TypeScript 的时候,上面的做法可能会比较麻烦。此时,你可以利用 TypeScript 的“类型断言”机制让代码顺利通过编译:
foo.bar = 123;
foo.bas = 'Hello World';
- 方便撰写类型文档
- TypeScript 会参与类型检查,确保类型安全
请看以下的示例:
使用 interface
可以确保类型安全,比如这种情况:
interface Foo {
bar: number;
}
let foo = {} as Foo;
foo.bar = 123;
foo.bas = 'Hello World';
原文: https://jkchao.github.io/typescript-book-chinese/tips/lazyObjectLiteralInitialization.html