接口

定义了tom变量,类型为Person,那么tom的形状必须和接口Person一致(不能多也不能少)

  1. interface Person {
  2. name: string;
  3. age: number;
  4. }
  5. let tom: Person = {
  6. name: 'Tom',
  7. age: 21
  8. }

可选属性(?:)

可选属性的含义是该属性可以不存在

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. }
  5. let tom: Person = {
  6. name: 'Tom'
  7. }; //合法

任意属性([propName: string])

一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它类型的子集

例如下面这种情况是不允许的

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. [propName: string]: string;
  5. }
  6. let tom: Person = {
  7. name: 'Tom',
  8. age: 25,
  9. gender: 'male'
  10. };

age是number类型,但任意类型只有字符串类型,任意类型应该要包括age的类型,正确写法如下

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. [propName: string]: string | number;
  5. }
  6. let tom: Person = {
  7. name: 'Tom',
  8. age: 25,
  9. gender: 'male'
  10. };

只读属性(readonly)

有时候我们希望对象中一些字段只能在创建时被赋值,那么可以用readonly定义只读属性。

  1. interface Person {
  2. readonly id: number;
  3. name: string;
  4. age?: number;
  5. [propName: string]: any;
  6. }
  7. let tom: Person = {
  8. id: 89757,
  9. name: 'Tom',
  10. gender: 'male'
  11. };
  12. tom.id = 9527; //× id设置了只读,不允许被赋值

数组类型

声明数组的方式如下所示

  1. let fibonacci: number[] = [1, 2, 3, 4, 5]
  2. let fib: Array<number> = [1, 2, 3]

函数的类型

函数声明

在JavaScript中声明函数的两种方式

  1. function sum(x, y){
  2. return x+y
  3. }

typescript中函数的声明

  1. function sum(x: number, y: number): number {
  2. return x + y;
  3. }

不难看出,在typescript中,不仅参数要声明类型,函数的返回值也要声明类型
**

函数表达式

js中

  1. // 函数表达式(Function Expression)
  2. let mySum = function (x, y) {
  3. return x + y;
  4. };


typescript中**

  1. let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
  2. return x + y;
  3. };

这段代码是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的mySum,是通过赋值操作进行类型推论而判断出来的。如果需要我们手动给mySum添加类型,则应该是这样

  1. let mySum: (x: number, y: number) => number = = function (x: number, y: number): number {
  2. return x + y;
  3. };

这里的箭头函数和ES6中的箭头函数不同。在ts的类型定义中, => 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。

可选参数

ts中使用?表示可选参数,可选参数一般需要放在末尾

  1. function buildName(firstName: string, lastName?: string) {
  2. if (lastName) {
  3. return firstName + ' ' + lastName;
  4. } else {
  5. return firstName;
  6. }
  7. }
  8. let tomcat = buildName('Tom', 'Cat');
  9. let tom = buildName('Tom');

因为可选参数后面不允许再出现必要参数了
**

参数默认值

ts中可以给函数的参数添加默认值,此时就不受「可选参数必须在必要参数后面」的限制了:

  1. function buildName(firstName: string = 'Tom', lastName: string) {
  2. return firstName + ' ' + lastName;
  3. }
  4. let tomcat = buildName('Tom', 'Cat');
  5. let cat = buildName(undefined, 'Cat');

联合类型 和 类型断言

联合类型

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:

  1. // 我们只需要用中竖线来分割两个
  2. let numberOrString: number | string
  3. // 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:
  4. numberOrString.length
  5. numberOrString.toString()

断言

  1. // 这里我们可以用 as 关键字,告诉typescript 编译器,你没法判断我的代码,但是我本人很清楚,这里我就把它看作是一个 string,你可以给他用 string 的方法。
  2. function getLength(input: string | number): number {
  3. const str = input as string
  4. if (str.length) {
  5. return str.length
  6. } else {
  7. const number = input as number
  8. return number.toString().length
  9. }
  10. }