TypeScript - 对象

对象是包含一组键值对的实例.值可以是标量值或函数,甚至是其他对象的数组.语法在下面给出 :

语法

 
 var object_name = {
 key1: "value1",//标量值
 key2:"value",
 key3:function(){
//函数
},
 key4:["content1 ","content2"]//collection 
};

如上所示,对象可以包含标量值,函数和结构,如数组和元组.

示例: Object Literal Notation

 
 var person = {
 firstname:"Tom",
 lastname:"Hanks"
}; 
//访问对象值
 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(){}//输入模板
} 
 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代码.

 
//由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

鸭子打字

在鸭子打字中,两个对象被认为是如果两者共享同一组属性,则属于同一类型.鸭子类型验证对象中某些属性的存在,而不是它们的实际类型,以检查它们的适用性.这个概念通常用下面的短语和减号来解释;

"当我看到一只像鸭子一样走路的小鸟像鸭子一样游泳,像鸭子一样呱呱叫时,我称那只小鸟为鸭子."

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})