打字稿:尖括号和界面

时间:2016-06-20 16:41:43

标签: javascript typescript

我有这支笔: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);

2 个答案:

答案 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);

在许多情况下,第二种形式是首选,但是如果你需要在填充所有属性的值之前创建一个对象,或者如果你想创建一个可能缺少某些属性的对象,那么形式是必要的。

亲自尝试:TypeScript Playground