跳转至

TypeScript

TypeScript 由 Microsoft 开发,是 ES 的超集,TS包含了ES的所有特性,同时还扩展了一些新的功能,如静态类型、接口、枚举、泛型等等。TS在编写代码时提供了更好的类型检查和代码提示功能,从而提高了代码的可维护性和可读性。

Angular2.0 和 Vue 3.0 都是基于 TypeScript 的

TypeScript 在运行前需要先编译为 JavaScript,而在编译阶段就会进行类型检查,可以理解为静态类型的 JS

npm install -g typescript

# typescript 的命令是:tsc
# 源码后缀为:.ts
# 用ts编写的React源码后缀为:.tsx
tsc hello.ts
function sayHello(person: string) {  // 冒号用于指定变量类型
    return 'Hello, ' + person;
}

let user = 'Tom';
console.log(sayHello(user));

数据类型

  • 任意类型
let myFavoriteNumber: any = 'seven';  // 也可以直接声明为任意类型
myFavoriteNumber = 7;  // 编译时不会报错

// 变量声明时未指定类型,且没有赋值,那么它会被识别为任意值类型
let something;
something = 'seven';
something = 7;  // 编译时不会报错

// 变量声明时未指定类型,会推测出一个类型,即ts的类型推论
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;  // 编译时会报错
  • 布尔值
let isDone: boolean = false;
  • 数值
let decLiteral: number = 6;
let binaryLiteral: number = 0b1010;  // 二进制数值
let hexLiteral: number = 0xf00d;  // 十六进制数值
let infinityNumber: number = Infinity;  // 无限
let notANumber: number = NaN;  // 非数值
  • 字符串
let sentence: string = `Hello, my name is ${myName}.`;
  • 空值
let n: null = null;  // 空值
let u: undefined = undefined;  // 未定义

// void表示不是任何类型,常用于函数中表示没有返回值
function alertName(): void {
    alert('My name is Tom');
}
  • 联合类型

Union Types 表示取值可以为多种类型中的一种,可以简单的理解为 or 的概念

let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

数组和元组

// 数组合并了相同类型的对象
let fibonacci: number[] = [1, 1, 2, 3, 5];  // 数值型数组

// 元组(Tuple)合并了不同类型的对象
let tom: [string, number] = ['Tom', 25];  // tom[0]='Tom'

枚举

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

// 常量枚举
const enum Directions {Up, Down, Left, Right}

对象类型

  • 使用类型别名定义对象
type MyObject = {
  name: string;
  age: number;
  gender: string;
}

const person: MyObject = {
  name: "John",
  age: 30,
  gender: "male"
};
  • 使用接口定义对象
// 接口一般首字母大写,有的编程语言中会建议接口的名称加上前缀:I
interface Person {
    readonly id: number;  // 只读属性,只需要在第一次实例化时赋值
    name: string;  // 普通属性,实例化时必需赋值
    age?: number;  // 可选属性,实例化时可以不赋值
    [propName: string]: any;  // 任意字符串类型属性: 任意类型属性值
}

// 实例化
let tom: Person = {
    id: 7,
    name: 'Tom',
    // age: 25,
    gender: 'male'
};

函数

// 函数声明(Function Declaration)
function sum(x, y) {
    return x + y;
}

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

// 对输入和输出进行约束
function buildName(firstName: string = 'Tom', lastName?: string) {
    // firstName默认值为Tom
    // lastName后的?表示这是一个可选参数
    return firstName;
}

箭头函数 =>

箭头函数是 ES6 引入的新语法,它简化了函数定义的书写方式,特别是对于只有一个参数和单行返回语句的函数。

箭头函数的语法为:(arguments) => expression

  • arguments 为参数列表
  • expression 为函数体,可以是单行表达式或者用花括号包裹的多行语句块

// class定义类
class Animal {
    public name;
    // 构造函数
    constructor(name) {
        this.name = name;
    }
    sayHi() {
        return `My name is ${this.name}`;
    }
}

// new实例化
let a = new Animal('Jack');
console.log(a.sayHi()); // My name is Jack

抽象类

// 不能被实例化
abstract class Animal {
    pass;
}

类型别名

type Name = string;
type NameResolver = () => string;
// 类型别名常用于联合类型
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
    if (typeof n === 'string') {
        return n;
    } else {
        return n();
    }
}

// 在类型别名中 => 表示函数类型的定义,左边为参数,右边为返回值
// 表示接收两个参数 x 和 y,类型均为 number,并返回一个类型为 number 的值
type MyFuncType = (x: number, y: number) => number;

泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

允许程序员在强类型程序设计语言 中编写代码时定义一些可变部分,这些部分在使用前必须作出指明。

<T>,我们称之为泛型变量(又称为类型变量、泛型参数),它是一种特殊的变量,声明时表示任何输入的类型,使用时进行指定数据类型,然后完成类型检测。

泛型常用 T、U、V 表示,通常用 T,T 是 Type 的简写

Array<any>  // 数组泛型

// 使用 extends 关键字实现类型的约束
// T 在没有明确指定时,被解析为 Animal 接口的类型(区别于默认值)
T extends Animal

// 表示 fn 可以接收任意数量和类型的参数
fn: (...args: T)