TypeScript - 对象
对象是包含一组键值对的实例。 这些值可以是标量值或函数,甚至是其他对象的数组。 语法如下 −
语法
var object_name = { key1: “value1”, //scalar value key2: “value”, key3: function() { //functions }, key4:[“content1”, “content2”] //collection };
如上所示,对象可以包含标量值、函数以及数组和元组等结构。
示例:对象字面量表示法
var person = { firstname:"Tom", lastname:"Hanks" }; //access the object values console.log(person.firstname) console.log(person.lastname)
编译时,它将在 JavaScript 中生成相同的代码。
上述代码的输出结果如下 −
Tom Hanks
TypeScript 类型模板
假设您在 JavaScript 中创建了一个对象文字,如下所示 −
var person = { firstname:"Tom", lastname:"Hanks" };
如果您想向对象添加一些值,JavaScript 允许您进行必要的修改。 假设我们稍后需要向 person 对象添加一个函数,这就是您可以执行此操作的方法。
person.sayHello = function(){ return "hello";}
如果您在 Typescript 中使用相同的代码,编译器会给出错误。 这是因为在 Typescript 中,具体对象应该有一个类型模板。 Typescript 中的对象必须是特定类型的实例。
您可以通过在声明中使用方法模板来解决此问题。
示例:Typescript 类型模板
var person = { firstName:"Tom", lastName:"Hanks", sayHello:function() { } //Type template } person.sayHello = function() { console.log("hello "+person.firstName) } person.sayHello()
编译时,它将在 JavaScript 中生成相同的代码。
上述代码的输出结果如下 −
hello Tom
对象也可以作为参数传递给函数。
示例:对象作为函数参数
var person = { firstname:"Tom", lastname:"Hanks" }; var invokeperson = function(obj: { firstname:string, lastname :string }) { console.log("first name :"+obj.firstname) console.log("last name :"+obj.lastname) } invokeperson(person)
该示例声明了一个对象文字。 函数表达式是通过传递 person 对象来调用的。
编译时,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var person = { firstname: "Tom", lastname: "Hanks" }; var invokeperson = function (obj) { console.log("first name :" + obj.firstname); console.log("last name :" + obj.lastname); }; invokeperson(person);
其输出如下 −
first name :Tom last name :Hanks
您可以动态创建并传递匿名对象。
示例:匿名对象
var invokeperson = function(obj:{ firstname:string, lastname :string}) { console.log("first name :"+obj.firstname) console.log("last name :"+obj.lastname) } invokeperson({firstname:"Sachin",lastname:"Tendulkar"});
编译时,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var invokeperson = function (obj) { console.log("first name :" + obj.firstname); console.log("last name :" + obj.lastname); }; invokeperson({ firstname: "Sachin", lastname: "Tendulkar" }); invokeperson({ firstname: "Sachin", lastname: "Tendulkar" });
其输出如下 −
first name :Sachin last name :Tendulkar
Duck-typing(鸭子类型)
在Duck-typing(鸭子类型)中,如果两个对象共享相同的属性集,则两个对象被认为是同一类型。 Duck-typing(鸭子类型)验证对象中是否存在某些属性,而不是它们的实际类型,以检查它们的适用性。 该概念通常由以下短语解释 −
"当我看到一只鸟像鸭子一样走路、像鸭子一样游泳、像鸭子一样嘎嘎叫时,我就称那只鸟为鸭子。"
TypeScript 编译器实现了Duck-typing(鸭子类型)系统,允许动态创建对象,同时保持类型安全。 下面的示例展示了如何将未显式实现接口但包含函数所需的所有成员的对象传递给函数。
示例
interface IPoint { x:number y:number } function addPoints(p1:IPoint,p2:IPoint):IPoint { var x = p1.x + p2.x var y = p1.y + p2.y return {x:x,y:y} } //Valid var newPoint = addPoints({x:3,y:4},{x:5,y:1}) //Error var newPoint2 = addPoints({x:1},{x:4,y:3})