TypeScript
JavaScript 的类型系统;同时支持很多额外的特性,比如:面向对象、接口、多态、继承、泛型等;
类型
基本类型
boolean; number; string;
对象类型
元祖:用于表示一个已知类型的数组(更精确);场景:定义函数返回值类型、接口属性类型 let tuple: [number, string] = [1, "a"]
;
数组:numberp[]
;Array[number]
;Array<T>
;
枚举:enum Color {Red, Green, Blue}
;
对象:object
其他类型
any:暂不确定的类型;
void:没有类型,表示没有返回值;
never:标识无法正常返回的函数,比如 new Error
;
null:空值;
undefined:未定义的值;
函数相关类型
参数
function greet(name: string) {}
返回值
function getName(): string {}
完整函数定义
type Greet = (name: string) => string;
const greet: Greet = ...
可选参数
function log(message?: string) {}
接口
对类或对象的一部分行为进行抽象,相当于和类约定好,要实现哪些功能,然后就在接口里定义成员的特征,然后类去实现;
泛型
定义可复用的组件,一个组件可以支持多种类型的数据;
泛型里的 T 代表任意类型,它可以指代函数的参数和返回值,然后在具体使用时会被实际的类型替换;
泛型和 any 的区别
1、T 会被实际的类型替换;any 就是 any 类型;
2、T 会进行类型检查;any 会绕过类型检查;
多态
相同的函数或方法可以【根据不同的对象类型】表现出不同的行为;
class Animal {
makeSound() {}
}
class Dog extends Animal {
makeSound() {}
}
class Cat extends Animal {
makeSound() {}
}
function animalSounds(animal) {
animal.makeSound();
}
const dog = new Dog();
const cat = new Cat();
animalSounds(dog);
animalSounds(cat);
一个 Animal 类有一个通用的 makeSound 方法,其子类 Dog 和 Cat 重写了 makeSound 方法,另有一个新的方法 animalSounds,这个方法里接受一个 animal 类型的参数,并执行了这个参数的 makesound 方法。这个参数在传入 cat 实例和 dog 实例时会表现出不同的行为,这就是多态。
重载
为同一个函数提供多个不同的签名,每个签名描述了【函数的参数类型和返回类型】;调用这个函数时,TypeScript 编译器会根据传递的参数来选择正确的函数签名,以确保类型安全。
function greet(person: string): string
function greet(person: string, age: number): string
function greet(person: string, age?: number): string
联合类型
表示取值可以为多种类型里的一种;
let code: number | string
联合类型也可以用在函数重载里;
类型断言
手动指定一个值的类型;
let strLength: number = (someValue as string).length
应用:覆盖 any 类型;修复类型不兼容问题;
比如:document.getElementById(’app’)
获取 DOM 元素的时候,编译器不知道 getElementById 的类型,但我知道是 HTMLElement,我就可以用类型断言告诉编译器;
索引类型
用来描述对象里动态的、不确定的属性的类型;
interface bookstore = {
name: string;
[category: string]: string[];
}
声明文件
声明一个与 JS 库同名的声明文件,比如:JQuery → jquery.d.ts
/// <reference types="jquery">
declare var jQuery: any; // 顶级变量,表示这是一个声明文件
interface jQuery {
// 声明接口或命名空间
css(propertyName: string, value: string): JQuery;
// 更多方法
}
// 声明模块导出语句:declare,export
declare module "jquery" {
export = jQuery;
}
引用声明文件后即可在 TS 中调用 JS 库并获得类型提示和检查;
装饰器
装饰器主要是用来修改类、方法、属性和参数行为的,使用@
符号跟在要修饰的目标前面;
可选链和非空断言运算符
可选链:.?
非空断言:!
都是用来处理类型中的 null 或 undefined,但作用有所不同;
const person = {
name: "Alice",
passport: {
id: "123456",
expires: "2025-12-31",
},
};
// 使用可选链来安全地访问护照的过期日期
const expirationDate = person.passport?.expires;
// 如果 person 对象中没有 passport 属性,可选链将不会引发错误,而是返回 undefined。
// 非空断言是你确定某个值不为空的时候使用
const element = document.getElementById("myElement");