我有这支笔:https://codepen.io/anon/pen/PzGxRX?editors=0011
我想知道let square = <Square>{};
和let s: Square = { sideLength: 23, color: 'red'};
之间的区别
难道我们不能避免前者而是完成后者吗?
interface Shape {
color: string
}
interface Square extends Shape {
sideLength: number;
}
let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
console.log(square);
let s: Square = { sideLength: 23, color: 'red'};
console.log(s);
答案 0 :(得分:1)
难道我们不能避免前者而是完成了后者吗?
绝对。在TypeScript中,初始化程序不是编码首选项,它们是确保对象满足接口定义的规范的一种方法。至关重要的是,如果您在方块中添加新的非可选属性,let s: Square = {...
变体将blow up as expected,而另一个变体(强制转换和分配)将保持沉默。 (当然,有人可能会意外删除或忘记添加其中一个属性赋值,这会再次引入TypeScript旨在避免的类型错误。)
尽可能避免施法。假设你的依赖关系不是循环的(很少这种情况),你总是可以重写这样的代码来使用初始化器。如果要创建可能缺少某些属性的对象,请通过添加?
在界面中将这些属性定义为可选:
interface Triangle {
nonOptional: number;
optional?: number;
}
const t: Triangle = {nonOptional: 1}; // no error
答案 1 :(得分:0)
它们看起来似乎功能相似,但它们的运行方式不同,并且会产生稍微不同的JavaScript输出。
第一种形式允许您创建一个空对象,同时仍然保持对该接口的引用。尝试添加接口上不存在的属性将标记该属性。但是,使用没有定义属性的对象不会导致错误。
第一个表单生成的代码如下所示:
var square = {};
square.color = "blue";
square.sideLength = 10;
console.log(square);
第二种形式创建对象内联,并且不允许您在不提供界面上定义的所有属性的情况下创建对象。它生成的代码如下:
var s = { sideLength: 23, color: 'red' };
console.log(s);
在许多情况下,第二种形式是首选,但是如果你需要在填充所有属性的值之前创建一个对象,或者如果你想创建一个可能缺少某些属性的对象,那么形式是必要的。