TypeScript 对象

由 bjcl 创建, 最后一次修改 2016-12-12

一个对象是包含一组键值对集合的实例。值可以是标量值或函数,甚至是其他对象的数组。语法如下所示:

语法

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)中,如果两个对象共享同一组属性,则认为它们属于同一类型。鸭子类型验证对象中某些属性的存在,而不是它们的实际类型,以检查它们的适用性。这个概念一般是可以由以下短语解释:

“当我看到一只像鸭子一样散步,像鸭子一样游动,像鸭子一样呱呱叫的鸟儿时,我称这只鸟为鸭子。”

TypeScript编译器实现鸭子类型系统,允许动态创建对象,同时保持类型安全。以下示例显示了如何传递未显式实现接口但包含函数所需的所有成员的对象。

示例

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})
以上内容是否对您有帮助:

二维码
建议反馈
二维码