TypeScript

面试
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");