这篇文章全面回顾了TypeScript的基础概念,包括其作为JavaScript超集引入的特性,如静态类型检查、类和接口等,以及如何通过安装TypeScript CLI开始使用。文章深入解析了类型系统基础,如基本类型、数组、元组、接口和类型别名,并展示了函数与泛型的用法。实战部分则通过编码题解析,涵盖了类型推断、类与继承、封装与多态、异常处理与类型保护等高级概念,为读者提供了TypeScript在编程中的实际应用场景。文章还提出了进阶特性与最佳实践,如高级泛型应用、联合类型与交叉类型、可空安全的代码编写和模块与命名空间的使用,并解答了面试中常见的TypeScript问题,提供了面试准备与策略,帮助读者全面掌握TypeScript,应对大厂面试中的TS相关真题。
TypeScript基础概念回顾 TypeScript简介与安装TypeScript 是一种超集于 JavaScript 的编程语言,它引入了静态类型检查、类、接口等现代编程特性,旨在提升开发效率和代码可维护性。要开始使用 TypeScript,首先需要安装 TypeScript CLI。安装命令如下:
npm install -g typescript
安装完成后,创建一个简单的 TypeScript 文件:
// hello.ts
console.log("Hello, TypeScript!");
通过 tsc
命令编译 TypeScript 文件:
tsc hello.ts
编译结果将生成 JavaScript 文件 hello.js
。
基本类型与数组
TypeScript 支持多种基本类型,如:string
、number
、boolean
等。数组类型使用方括号表示,可以指定元素类型:
let numbers: number[] = [1, 2, 3];
let strings: string[] = ["apple", "banana", "cherry"];
元组
元组允许定义元素数量和类型都可变的数组:
let mixedTuple: [string, number, boolean] = ["one", 2, true];
接口与类型别名
接口定义对象的结构,类型别名可重用类型定义:
interface Person {
firstName: string;
lastName: string;
}
type AddressType = {
street: string;
city: string;
};
let user: Person = { firstName: "John", lastName: "Doe" };
函数与泛型
函数使用 =>
定义返回类型,泛型使用 <T>
语法:
function identity<T>(arg: T): T {
return arg;
}
let name: string = identity("Alice");
实战编码题解析
类型推断实例
通过类型推断,TypeScript 可自动推断变量类型:
let age = 25;
let ageStr = age.toString();
console.log(`My age is ${ageStr}.`);
使用类与继承
类通过 class
关键字定义,继承使用 extends
:
class Animal {
sound: string = "Noise";
}
class Cat extends Animal {
constructor() {
super();
this.sound = "Meow";
}
}
let myCat = new Cat();
console.log(myCat.sound);
封装与多态实践
利用类和接口进行封装,多态通过实现接口来实现:
interface Shape {
color: string;
}
class Circle implements Shape {
color: string = "Red";
}
class Square implements Shape {
color: string = "Green";
}
function applyColor(shape: Shape) {
console.log(`Applying color: ${shape.color}`);
}
applyColor(new Circle());
applyColor(new Square());
异常处理与类型保护
利用 as
运算符和类型断言:
function getAge(user: Person): number {
return user.age; // 这里可能抛出异常,使用类型保护确保类型正确
}
function protectedGetAge(user: Person): number {
return user.age as number;
}
let user = { firstName: "John", lastName: "Doe" };
console.log(getAge(user)); // 报错
console.log(protectedGetAge(user)); // 安全地获取年龄
进阶特性与最佳实践
高级泛型应用
泛型类型允许创建可复用的代码:
function swap<T>(arr: T[], index1: number, index2: number): void {
[arr[index1], arr[index2]] = [arr[index2], arr[index1]];
}
let numbers = [1, 2, 3];
swap(numbers, 0, 2);
console.log(numbers); // 输出: [3, 2, 1]
联合类型与交叉类型
联合类型允许定义多个类型中的任意一个:
let item: string | number = "apple";
item = 10; // 允许转换类型
交叉类型允许定义多个类型中的所有属性:
type Mixed = string & number & boolean;
// 使用交叉类型定义非常规场景时应谨慎,具体应用需根据实际情况调整。
编写可空安全的代码
使用 | null
或 | undefined
防止空值问题:
function greet(name: string | null): string {
return name || "Guest";
}
console.log(greet(null)); // 输出: "Guest"
模块与命名空间
模块允许按需加载代码,命名空间用于组织相关类型和函数:
// utils.ts
export function sum(a: number, b: number): number {
return a + b;
}
// main.ts
import { sum } from "./utils";
console.log(sum(1, 2)); // 输出: 3
namespace Calc {
export function subtract(a: number, b: number): number {
return a - b;
}
}
console.log(Calc.subtract(3, 1)); // 输出: 2
解惑面试高频难题
解释型题:any与unknown的区别
any
类型表示任何值,而 unknown
类型用于表示非 null
或 undefined
的值。使用 unknown
类型时,依然需要类型断言来访问其属性:
let data: any = { key: "value" };
// 错误:不能直接访问属性
// console.log(data.key);
// 正确:使用类型断言
console.log((data as unknown).key); // 输出: "value"
let unknownData: unknown = { key: "value" };
console.log(unknownData.key); // 输出: "value"
实践型题:实现一个简单的类型守卫
function isNumber(val: any): val is number {
return typeof val === "number";
}
function logValue(val: any) {
if (isNumber(val)) {
console.log(`Number: ${val}`);
} else {
console.log(`Not a number: ${val}`);
}
}
logValue(42); // 输出: Number: 42
logValue("text"); // 输出: Not a number: text
设计型题:如何设计一个类型安全的API
设计类型安全的 API 关键在于提供清晰的类型定义和使用类型保护:
export interface User {
id: number;
name: string;
}
type UserResponse = {
data: User[];
};
function getUsers(): Promise<UserResponse> {
return new Promise((resolve) => {
// 假设这里从API获取数据
resolve({ data: [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }] });
});
}
async function getSingleUser(id: number): Promise<User> {
const users = await getUsers();
return users.data.find((user) => user.id === id);
}
getSingleUser(1).then((user) => {
console.log(user); // 输出: { id: 1, name: "Alice" }
});
TS与框架应用
TypeScript 在现代 JavaScript 框架中发挥着重要作用,例如在使用 Angular、React 或 Vue 时,TypeScript 提供了如下优势:
- 类型安全:减少运行时错误,提高代码质量。
- 更清晰的代码结构:利用接口和类型定义,使得组件、服务和数据模型更加清晰。
- 更好的开发体验:集成 IDE 和代码编辑器的智能提示,提高生产力。
时间管理与解题步骤
面试时,合理分配时间至关重要。首先,理解题目,然后快速确定解题策略,最后编写代码并验证。
高效复习与自我检测
- 理论与实践结合:不仅学习理论知识,还要通过实践项目加深理解。
- 练习常见题型:了解常见的面试题型和解题模式。
- 使用平台练习:利用在线平台如 LeetCode、Hackerrank 等进行练习。
面试心态调整与常见误区避免
- 缓解紧张:准备充分,练习自我介绍和常见问题回答。
- 避免误区:不要过分依赖注释,保持代码简洁、可读性。
- 积极沟通:遇到不确定的点,主动提问,展现开放和学习的态度。
通过系统的学习、实际项目经验的积累以及面试技巧的磨练,成为一名 TS 大厂的初级开发者将不再是梦想。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章