TypeScript中的对象与已转换的文字对象

时间:2016-09-14 21:19:23

标签: typescript

我真的不知道何时使用它:

interface IFoo
{
   bar: string;
}

...

let array: IFoo[];

array.push(<IFoo>{ bar: "test" });

或者

class Foo
{
   bar: string;
}

...

let array: Foo[];
let obj = new Foo();

obj.bar = "test";

array.push(obj);

重要的是我来自C#世界,而对我来说,第二种方式更干净,但它也很容易使用第一种方式,尽管它没有第二种选择那么严格。因此,我真的很挣扎,现在,我只是觉得我可以使用我想要的那个,但我很确定这两者都有利弊。不幸的是,我在谷歌上找不到任何东西。

由于

2 个答案:

答案 0 :(得分:2)

在javascript中,我们实际上没有类,但只有普通对象*(&#34; hash-tables&#34; -y)具有原型功能。函数是某种对象(在它上面有一点语法糖)。

*(在学术上没有正确地说,并隐藏一些东西)

在浏览器的调试器中尝试以下示例,进行一些检查

var parent = {
   method1: function() { return 1 } ,
   method2: function() { return 2 }
}
var child = Object.create(parent)
child.method2 = function() { return '2a' }

child.__proto__   //shows parent
parent.__proto__  //shows Object (the "root class")
child.method3()   //undefined is not a function
child.method2()   //2a, not 2
child.method1()   //method1 not found, looks at __proto__, returns 1
child.toString    
//looks at child, not found
//looks at child.__proto__ (parent), not found
//looks at child.__proto__.__proto__ (Object), returns function

哪些类(来自ES2015和转换程序)大致做的是为了从其他语言中获取class行为/编程风格,必须编写一些胶水代码,从对象和原型。

在ES2015中,类声明创建了一个&#34;原型&#34; object,new(或Object.create **)创建一个&#34;实例&#34;继承该原型的对象。

现在回到打字稿......

var a : { b : string }
a.b = '4'

{ b : string }只是一个注释。它进入了类型领域。让我们在打字稿中说我们有2个领域,即具体变量的领域,最终生成代码;和类型的领域,仅用于辅助/ linting,但不会在真正的JS中结束。可以使用{ b : string }interface语法

引用type
type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta

声明类型注释(包括接口)将零代码添加到具体的JS领域。

..另一方面,当你使用class时,typescript会创建两个

  • 具体的JS代码(即原型对象)
  • 还有几个类型的境界居民。

TL; DR:

现在回答,在这两种方式中都没有大问题,但是使用接口(以及更少的类)倾向于最常见的javascript编码风格。一些JS学校主张反对使用课程,因为你可以通过其他模式大多达到同样的效果。

答案 1 :(得分:0)

我认为这两个例子都会失败,因为你没有初始化array的值,只是为它声明了一个类型。你需要将它初始化为:

let array : Array<IFoo> = [];
array.push( {bar: "test" } );

在定义其他成员(如方法或计算属性)之前,使用类的优势并不重要。在这种情况下,您可能希望使用new Foo(...)