本文详细介绍了TS大厂面试真题的相关内容,涵盖了TS的基础回顾、面试题解析以及实战演练。文章不仅提供了丰富的TS基础知识,还通过实战案例帮助读者理解和掌握面试中常见的TS问题。此外,文章还分享了面试前的准备技巧和代码规范,旨在帮助读者顺利通过TS大厂面试真题的考验。
TypeScript(简称 TS)是一种由微软开发的开源编程语言,它是在 JavaScript 的基础上添加了静态类型系统。TS 兼容 JavaScript,能够运行在任何支持 JavaScript 的平台。它不仅支持现有的 JavaScript 代码,也能够支持未来 JavaScript 新增的特性。
TypeScript 的主要优势在于静态类型检查,这有助于提前发现错误,并且提高代码的可维护性。此外,TypeScript 还提供了诸如类、接口、泛型、装饰器等高级特性。这些特性使得编写复杂的应用程序更加容易。
安装 TypeScript 可以通过 npm(Node.js 的包管理器)或者 yarn(另一个流行的包管理器)来完成。以下是使用 npm 安装 TypeScript 的步骤:
确保已经安装了 Node.js。如果没有,请访问 Node.js 官方网站 下载并安装。
打开终端或命令提示符,运行以下命令来全局安装 TypeScript:
npm install -g typescript
tsc -v
检查安装是否成功,这将显示已安装的 TypeScript 版本。在 TypeScript 中,类型声明是基础和重要的部分。下面是一些常用的类型声明和语法:
基本类型
string
:表示字符串类型,例如:let greeting: string = "Hello, TypeScript!";
number
:表示数字类型,例如:let age: number = 25;
boolean
:表示布尔值,例如:let isDone: boolean = true;
null
和 undefined
:这些类型表示空值和未定义值。void
:表示函数没有返回值。数组类型
let list: number[] = [1, 2, 3];
Array<T>
,例如:let list: Array<number> = [1, 2, 3];
元组类型
let x: [number, string] = [1, "Hello"];
对象类型
interface Point { x: number; y: number; } let point: Point = { x: 1, y: 2 };
函数类型
function sum(a: number, b: number): number { return a + b; }
类型推断
let message = "Hello, TypeScript!"; console.log(message); // TypeScript 推断 message 是 string 类型
类型别名
type StringNumberPair = [string, number]; let pair: StringNumberPair = ["Hello", 42];
联合类型
let numOrString: number | string; numOrString = 42; numOrString = "Hello";
枚举类型
enum Color { Red, Green, Blue } let color: Color = Color.Red;
接口
interface User { id: number; name: string; address?: string; // 可选属性 } let user: User = { id: 1, name: "John" };
泛型
function identity<T>(arg: T): T { return arg; } let output = identity<string>("Hello");
在大厂面试中,TypeScript 面试题通常包括以下几类:
面试题示例:
问题:在 TypeScript 中,如何定义一个数组类型的变量,其中包含三个字符串元素?
解答与实战演练:
在解答此题时,我们需要明确如何在 TypeScript 中定义一个数组变量,并指定其元素类型。以下展示了如何定义一个包含三个字符串元素的数组:
let stringArray: string[] = ["Hello", "TypeScript", "World"];
我们也可以使用数组泛型语法:
let stringArray: Array<string> = ["Hello", "TypeScript", "World"];
面试题示例:
问题:在 TypeScript 中,如何定义一个类并实现继承?
解答与实战演练:
在 TypeScript 中,定义类和实现继承的基本语法如下:
class Animal { public name: string; constructor(name: string) { this.name = name; } public makeSound(): void { console.log("Some generic animal sound"); } } class Dog extends Animal { constructor(name: string) { super(name); } public makeSound(): void { console.log("Woof!"); } } let myDog = new Dog("Rex"); console.log(myDog.name); // 输出: Rex myDog.makeSound(); // 输出: Woof!
在这个例子中,Dog
类继承了 Animal
类,并覆盖了 makeSound
方法。此外,通过调用 super
方法,可以在子类的构造函数中调用父类的构造函数。
面试题示例:
问题:什么是装饰器?如何在 TypeScript 中使用装饰器?
解答与实战演练:
装饰器是一种设计模式,允许在不修改原代码的情况下增强或者改变函数和类的行为。装饰器使用 @
符号加前缀,可以在运行时或编译时动态地修改类的行为。
以下是一个使用装饰器的简单示例:
function logClass(target: any) { console.log(`Class: ${target.name}`); } @logClass class MyClass { constructor() { console.log("Constructor called"); } } // 输出 Class: MyClass // 输出 Constructor called
在上面的例子中,logClass
装饰器会在实例化 MyClass
之前打印类的名称。
面试前的准备工作对于面试成功至关重要。以下是一些关键步骤和建议:
编写高质量的 TypeScript 代码不仅仅局限于正确地应用类型声明和语法,还应该遵循一些代码规范和最佳实践。以下是一些建议:
使用有意义的变量名
a
, b
或 c
这样的单字符变量名。let userCount: number = 100;
避免使用全局变量
function getUserCount() { let userCount: number = 100; return userCount; }
使用模块化设计
例如,可以使用 export
和 import
关键字:
// user.ts export class User { constructor(public id: number, public name: string) {} } // app.ts import { User } from './user'; let user = new User(1, 'John');
使用类型注解
function addNumbers(a: number, b: number): number { return a + b; }
利用 TypeScript 的静态类型检查
const
, let
和 var
合理声明变量,使用 never
类型来表示永远不会返回的函数等。编写单元测试
例如,可以使用 Jest 或 Mocha 这样的测试框架来编写测试:
import { expect } from 'chai'; import { addNumbers } from './addNumbers'; describe('addNumbers', () => { it('should return the sum of two numbers', () => { expect(addNumbers(1, 2)).to.equal(3); }); });
问题:定义一个类型别名,并创建一个变量使用该类型别名。
解答与实战演练:
首先,定义一个类型别名,然后使用它来声明一个变量:
type Point = { x: number; y: number; }; let point: Point = { x: 1, y: 2 };
在这个例子中,我们定义了一个 Point
类型别名,它表示一个包含 x
和 y
属性的对象。然后,我们使用该类型来声明一个变量 point
。
问题:实现一个简单的装饰器,打印函数的执行时间。
解答与实战演练:
以下是一个简单的装饰器实现,用于打印函数的执行时间:
function logExecutionTime(target: any, propertyName: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; descriptor.value = function (...args: any[]) { const start = Date.now(); const result = originalMethod.apply(this, args); const end = Date.now(); console.log(`Execution time of ${propertyName}: ${end - start} ms`); return result; }; return descriptor; } class Timer { @logExecutionTime computeTime() { let sum = 0; for (let i = 0; i < 1000000; i++) { sum += i; } return sum; } } const timer = new Timer(); timer.computeTime(); // 输出 Execution time of computeTime: X ms
在这个例子中,logExecutionTime
装饰器会在函数执行前后记录时间,并打印执行时间。computeTime
方法被装饰后,执行时会输出其执行时间。
在实际面试中,面试官可能会要求你编写一些代码来解决给定的问题。以下是一个示例:
问题:实现一个函数,该函数接收一个数组和一个数字,返回数组中大于给定数字的所有元素。
解答与实战演练:
以下是一个简单的实现:
function filterGreaterThan<T>(arr: T[], threshold: number): T[] { return arr.filter(item => { if (typeof item === 'number' && item > threshold) { return true; } return false; }); } let numbers = [1, 2, 3, 4, 5]; let filtered = filterGreaterThan(numbers, 3); console.log(filtered); // 输出: [4, 5]
在这个例子中,我们定义了一个名为 filterGreaterThan
的泛型函数,它接收一个泛型数组 arr
和一个数字 threshold
作为参数,返回一个过滤后的数组。我们使用 Array.prototype.filter
方法来筛选出所有大于 threshold
的元素。
问题:TypeScript 和 JavaScript 有什么区别?
解答与技巧:
TypeScript 是 JavaScript 的一个超集,这意味着所有有效的 JavaScript 代码都是有效的 TypeScript 代码。TypeScript 主要增加了静态类型检查和一些高级特性,如类、接口、泛型和装饰器等。这些特性使得编写大型复杂的应用程序更加容易和安全。
问题:什么是静态类型检查?
解答与技巧:
静态类型检查是指在编译时对程序进行类型检查,而不是在运行时进行。TypeScript 的静态类型检查可以在编译阶段捕获类型错误,从而避免运行时错误。这有助于提高代码的健壮性和可维护性。
问题:什么是泛型?
解答与技巧:
泛型是编程语言中的一种特性,允许函数、接口或类在多个类型上通用。通过使用泛型,可以编写更灵活和可重用的代码。例如,下面是一个简单的泛型函数:
function identity<T>(arg: T): T { return arg; } let output = identity<string>("Hello"); // 使用泛型类型 <string> console.log(output); // 输出: Hello
在这个例子中,identity
函数可以接受任何类型的参数,并返回相同类型的值。
问题:类和对象的区别是什么?
解答与技巧:
类和对象是面向对象编程中的两个基本概念。类是一组对象的蓝图或模板,它定义了对象的结构和行为。而对象是类的实例,它具体化了类中的数据和方法。
例如,以下是一个简单的类定义:
class Point { x: number; y: number; constructor(x: number, y: number) { this.x = x; this.y = y; } } let point = new Point(10, 20); // 创建 Point 类的实例
在这个例子中,Point
类定义了一个包含 x
和 y
属性的对象,而 point
是 Point
类的一个实例。
回顾和巩固前面所学的内容是非常重要的。以下是一些复习建议:
通过以上步骤,你将能够更好地准备 TypeScript 面试,并在实际工作中应用 TypeScript 的高级特性,提高代码质量和开发效率。