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.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
鸭子类型
在鸭子类型中,如果两个对象共享相同的属性集,则认为它们属于相同的类型。鸭子类型验证对象中是否存在某些属性,而不是验证它们的实际类型,以检查它们的适用性。这个概念通常用以下一句话来解释:
“当我看到一只走路像鸭子、游泳像鸭子、嘎嘎叫像鸭子的鸟,我称它为鸭子。”
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})