TypeScript - 对象



在 TypeScript 中,对象是一个包含一组键值对的实例。键值对也称为对象属性。值可以是标量值、函数,甚至其他对象的数组。如果属性的值是一个函数,则该属性称为方法。

语法

在 TypeScript 中创建对象的语法如下所示:

var object_name = { 
   key1: "value1", //scalar value 
   key2: "value",  
   key3: function() {
      //functions 
   }, 
   key4:[ "content1", "content2"] //collection  
};

如上所示,一个对象可以包含标量值、函数以及数组和元组等结构。

类型注解

在 TypeScript 中,我们应该像下面这样对对象属性进行注解:

let person: {name: string, age: number} = {
   name: "Tom Hanks",
   age: 35,
}

在上面的示例中,我们对 person 对象的 nameage 属性进行了注解。

我们还可以使用接口为对象属性创建类型。请看下面的示例:

interface PersonType {
   fullname: string;
   age: number
}
var person: PersonType = { fullname:"Tom Hanks", age:32 };

对象字面量表示法

对象字面量表示法是在 TypeScript 中创建对象的简便方法。我们使用花括号 ({}) 来创建对象。对象的每个属性都用逗号分隔。每个属性都写成属性名称(键)后跟冒号 (:),再跟属性值。

示例

在下面的示例中,我们创建了一个名为 person 的对象,它包含两个属性。第一个属性是 firstname: "Tom",第二个属性是 lastname: "Hanks"。我们访问属性值并在控制台中打印它们。

var person:{ firstName: string, lastName: string}= { 
   firstName:"Tom", 
   lastName:"Hanks" 
}; 
//access the object values 
console.log(person.firstName) 
console.log(person.lastName)

编译后,它将在 JavaScript 中生成以下代码。

var person = {
    firstName: "Tom",
    lastName: "Hanks"
};
//access the object values 
console.log(person.firstName);
console.log(person.lastName);

输出

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 中生成相同的代码。

输出

上面生成的 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" });

输出

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