Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象与TypeScript中的强制转换文字对象_Typescript - Fatal编程技术网

对象与TypeScript中的强制转换文字对象

对象与TypeScript中的强制转换文字对象,typescript,Typescript,我真的不知道什么时候用这个: interface IFoo { bar: string; } ... let array: IFoo[]; array.push(<IFoo>{ bar: "test" }); 事情是,我来自C#世界,对我来说,第二种方法更干净,但使用第一种方法也很诱人,尽管它不像第二种方法那么严格。因此,我真的很挣扎,现在,我只是觉得我可以使用我想要的,但我很确定,两者都有利弊。不幸的是,我在谷歌上找不到任何东西 谢谢我认为这两个示例都会失败,因为您没

我真的不知道什么时候用这个:

interface IFoo
{
   bar: string;
}

...

let array: IFoo[];

array.push(<IFoo>{ bar: "test" });
事情是,我来自C#世界,对我来说,第二种方法更干净,但使用第一种方法也很诱人,尽管它不像第二种方法那么严格。因此,我真的很挣扎,现在,我只是觉得我可以使用我想要的,但我很确定,两者都有利弊。不幸的是,我在谷歌上找不到任何东西


谢谢

我认为这两个示例都会失败,因为您没有初始化
数组
的值,只是为它声明了一个类型。您需要对其进行如下初始化:

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

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

,我们实际上没有类,只有具有原型功能的普通对象*(“哈希表”-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和transpilers)所做的大致工作是从其他语言(从对象和原型开始)中获得
class
行为/编程风格,而您必须编写一些粘合代码

在ES2015中,类声明创建一个“原型”对象,而
new
(或object.create**)创建一个继承该原型的“实例”对象

现在回到打字脚本

var a : { b : string }
a.b = '4'
{b:string}
只是一个注释。它进入类型领域。让我们假设在typescript中我们有两个领域,具体变量的领域,最终进入生成的代码;以及类型领域,它们仅用于辅助/linting,但不会最终出现在真正的JS中<代码>{b:string}可以使用
接口
类型
语法进行引用

type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta
声明类型注释(包括接口)将零代码添加到具体的JS领域

…另一方面,当您使用
时,typescript会同时创建

  • 具体JS代码(即原型对象)
  • 还有一些典型的王国居民
TL;博士:


现在来看答案,这两种方法中的任何一种都没有大问题,但是使用接口(和较少的类)倾向于最常见的javascript编码风格。一些JS学校反对使用课堂,因为你可以通过其他模式达到同样的效果。

为什么要在第一个例子中使用角色?这是不必要的,但这个问题仍然有效;-)如果您只想拥有一个具有属性的对象,那么可以选择接口的第一个选项,但是如果您想拥有该对象的方法,那么可以使用classA对@NitzanTomer的重新表述:当您想要描述数据时,请使用接口。当您想要提供一个实现(不是由服务或外部函数处理的)时,请使用一个类。有关更多详细信息,请参阅,我确实忘记了初始化。这是因为我直接在那里输入了代码,而没有对其进行测试;-)好的,所以一个有效的方法是在需要包含方法的高级对象时使用类,而在不需要时使用普通对象?谢谢你这样解释。越简单越好。
type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta