我真的不知道何时使用它:
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#世界,而对我来说,第二种方式更干净,但它也很容易使用第一种方式,尽管它没有第二种选择那么严格。因此,我真的很挣扎,现在,我只是觉得我可以使用我想要的那个,但我很确定这两者都有利弊。不幸的是,我在谷歌上找不到任何东西。
由于
答案 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会创建两个
TL; DR:
现在回答,在这两种方式中都没有大问题,但是使用接口(以及更少的类)倾向于最常见的javascript编码风格。一些JS学校主张反对使用课程,因为你可以通过其他模式大多达到同样的效果。
答案 1 :(得分:0)
我认为这两个例子都会失败,因为你没有初始化array
的值,只是为它声明了一个类型。你需要将它初始化为:
let array : Array<IFoo> = [];
array.push( {bar: "test" } );
在定义其他成员(如方法或计算属性)之前,使用类的优势并不重要。在这种情况下,您可能希望使用new Foo(...)
。