TypeScript 面试题
-
什么是 TypeScript 的优势?
TypeScript 提供了静态类型检查、更好的工具支持以及更丰富的面向对象编程特性。它可以提高代码的可维护性、可读性和可靠性,并且可以在开发阶段捕获潜在的错误。
-
什么是类型断言(Type Assertion)?如何在 TypeScript 中使用类型断言?
类型断言允许开发者手动指定变量的类型。在 TypeScript 中,可以使用尖括号语法或者 as 关键字进行类型断言。例如:
typescriptlet value: any = "Hello, TypeScript!"; let length1: number = (<string>value).length; // 使用尖括号语法 let length2: number = (value as string).length; // 使用 as 关键字 ```
-
什么是可选属性和只读属性?如何在接口中定义它们?
可选属性允许对象中的某些属性可以不必全部存在,而只读属性则表示属性值在创建后不能被修改。在 TypeScript 中,可以使用问号
?
来定义可选属性,使用readonly
关键字来定义只读属性。例如:typescriptinterface Person { name: string; age?: number; // 可选属性 readonly id: number; // 只读属性 } let person: Person = { name: "Alice", id: 123 }; person.age = 20; // 可选属性可以不指定 person.id = 456; // 错误,只读属性不能修改 ```
-
什么是命名空间(Namespace)?请举例说明如何在 TypeScript 中使用命名空间。
命名空间是用来组织和封装代码的一种方式,它可以避免全局命名冲突。在 TypeScript 中,可以使用命名空间关键字
namespace
来定义命名空间。例如:typescript// math.ts namespace MathUtils { export function add(x: number, y: number): number { return x + y; } } // app.ts let result = MathUtils.add(3, 5); console.log(result); // 输出:8 ```
-
TypeScript 中的类型别名和接口有什么区别?什么时候应该使用类型别名?
类型别名(Type Alias)和接口(Interface)都可以用来描述类型,但它们有一些区别。接口创建了一个新的命名类型,而类型别名为现有类型提供了一个别名。通常在以下情况下应使用类型别名:
- 当需要联合多个类型时,可以使用联合类型别名;
- 当需要使用元组(Tuple)类型时,可以使用元组类型别名;
- 当需要使用复杂的类型操作符(如联合类型、交叉类型等)时,可以使用类型别名。
例如:
typescripttype Status = "success" | "error"; type Point = [number, number]; type Shape = Square | Circle; interface Square { kind: "square"; size: number; } interface Circle { kind: "circle"; radius: number; } ```