- TypeScript 基础
- TypeScript - 首页
- TypeScript - 路线图
- TypeScript - 概述
- TypeScript - 环境设置
- TypeScript - 基本语法
- TypeScript 与 JavaScript
- TypeScript - 特性
- TypeScript - 变量
- TypeScript - let & const
- TypeScript - 运算符
- TypeScript 基本类型
- TypeScript - 类型
- TypeScript - 类型注解
- TypeScript - 类型推断
- TypeScript - 数字
- TypeScript - 字符串
- TypeScript - 布尔值
- TypeScript - 数组
- TypeScript - 元组
- TypeScript - 枚举
- TypeScript - Any
- TypeScript - Never
- TypeScript - 联合类型
- TypeScript - 字面量类型
- TypeScript - 符号
- TypeScript - null 与 undefined
- TypeScript - 类型别名
- TypeScript 控制流
- TypeScript - 决策
- TypeScript - if 语句
- TypeScript - if else 语句
- TypeScript - 嵌套 if 语句
- TypeScript - switch 语句
- TypeScript - 循环
- TypeScript - for 循环
- TypeScript - while 循环
- TypeScript - do while 循环
- TypeScript 函数
- TypeScript - 函数
- TypeScript - 函数类型
- TypeScript - 可选参数
- TypeScript - 默认参数
- TypeScript - 匿名函数
- TypeScript - 函数构造器
- TypeScript - rest 参数
- TypeScript - 参数解构
- TypeScript - 箭头函数
- TypeScript 接口
- TypeScript - 接口
- TypeScript - 扩展接口
- TypeScript 类和对象
- TypeScript - 类
- TypeScript - 对象
- TypeScript - 访问修饰符
- TypeScript - 只读属性
- TypeScript - 继承
- TypeScript - 静态方法和属性
- TypeScript - 抽象类
- TypeScript - 访问器
- TypeScript - 鸭子类型
- TypeScript 高级类型
- TypeScript - 交叉类型
- TypeScript - 类型守卫
- TypeScript - 类型断言
- TypeScript 类型操作
- TypeScript - 从类型创建类型
- TypeScript - Keyof 类型操作符
- TypeScript - Typeof 类型操作符
- TypeScript - 索引访问类型
- TypeScript - 条件类型
- TypeScript - 映射类型
- TypeScript - 模板字面量类型
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型约束
- TypeScript - 泛型接口
- TypeScript - 泛型类
- TypeScript 杂项
- TypeScript - 三斜线指令
- TypeScript - 命名空间
- TypeScript - 模块
- TypeScript - 环境声明
- TypeScript - 装饰器
- TypeScript - 类型兼容性
- TypeScript - 日期对象
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 实用程序类型
- TypeScript - 装箱和拆箱
- TypeScript - tsconfig.json
- 从 JavaScript 到 TypeScript
- TypeScript 有用资源
- TypeScript - 快速指南
- TypeScript - 有用资源
- TypeScript - 讨论
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 对象的 name 和 age 属性进行了注解。
我们还可以使用接口为对象属性创建类型。请看下面的示例:
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})