1. TypeScript 是什么?
解析:TypeScript 是一种由微软开发的开源编程语言,是 JavaScript 的超集,增加了静态类型和其他语言特性。TypeScript 可以编译成纯 JavaScript。
2. TypeScript 的主要特性有哪些?
解析:
- 静态类型:允许在编译时检查类型。
- 接口:定义对象的结构。
- 类:支持面向对象编程。
- 枚举:为一组相关的常量赋予名称。
- 装饰器:用于元编程的特性。
3. 在 TypeScript 中,如何定义一个接口?
示例:
interface Person {
name: string;
age: number;
}
4. TypeScript 中的类型推断是什么?
解析:类型推断是 TypeScript 自动推断变量类型的能力。编译器根据变量的初始值和上下文来推断类型。
5. TypeScript 中的联合类型是什么?
解析:联合类型允许一个变量可以是多种类型之一。
示例:
let value: string | number;
value = "Hello";
value = 42;
6. 如何在 TypeScript 中定义一个类?
示例:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${
this.name}`);
}
}
7. TypeScript 中的类型别名是什么?
解析:类型别名用于给类型赋予一个新名称,可以用于基本类型、联合类型、元组等。
示例:
type StringOrNumber = string | number;
8. TypeScript 中的枚举类型是什么?
解析:枚举是一种特殊的类型,用于定义一组命名常量。
示例:
enum Color {
Red,
Green,
Blue,
}
9. TypeScript 中的泛型是什么?
解析:泛型允许创建可重用的组件,能够在保留类型信息的同时支持多种数据类型。
示例:
function identity<T>(arg: T): T {
return arg;
}
10. 如何在 TypeScript 中使用装饰器?
解析:装饰器是用于修改类及其成员的特殊类型的声明。
示例:
function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${
propertyKey} with`, args);
return originalMethod.apply(this, args);
};
}
11. TypeScript 中的抽象类是什么?
解析:抽象类是不能被实例化的类,用于定义子类的结构。
示例:
abstract class Animal {
abstract makeSound(): void;
}
class Dog extends Animal {
makeSound() {
console.log("Woof!");
}
}
12. 如何在 TypeScript 中实现类型保护?
解析:类型保护用于在运行时检查变量的类型,以确保安全地访问其属性。
示例:
function printId(id: number | string) {
if (typeof id === "string") {
console.log(`String ID: ${
id}`);
} else {
console.log(`Number ID: ${
id}`);
}
}
13. TypeScript 中的交叉类型是什么?
解析:交叉类型允许将多个类型组合为一个类型,包含所有类型的属性。
示例:
type Person = {
name: string };
type Employee = {
employeeId: number };
type EmployeeDetails = Person & Employee;
14. TypeScript 中如何处理可选属性?
解析:可选属性在接口或类中使用问号(?
)表示。
示例:
interface Person {
name: string;
age?: number; // 可选属性
}
15. 什么是 TypeScript 的声明文件(.d.ts
)?
解析:声明文件用于为 JavaScript 代码提供类型信息,允许 TypeScript 检查类型并提供 IntelliSense。
16. TypeScript 中的 never
类型是什么?
解析:never
类型表示一个永远不会出现的值,通常用于表示抛出异常或无限循环的函数返回值。
示例:
function throwError(message: string): never {
throw new Error(message);
}
17. TypeScript 中的 any
类型是什么?
解析:any
类型表示可以是任何类型,关闭了类型检查,通常用于不确定类型的场景。
18. 如何在 TypeScript 中使用模块?
解析:可以使用 import
和 export
关键字来创建和使用模块。
示例:
// math.ts
export function add(x: number, y: number): number {
return x + y;
}
// app.ts
import {
add } from './math';
console.log(add(2, 3));
19. TypeScript 中的函数重载是什么?
解析:函数重载允许为同一函数定义多个类型签名。
示例:
function overload(x: string): string;
function overload(x: number): number;
function overload(x: any): any {
return x;
}
20. 如何在 TypeScript 中处理 Promise?
解析:可以使用 Promise
类型进行异步操作,并使用 async/await
语法简化异步代码。
示例:
async function fetchData(): Promise<string> {
return "数据";
}
21. TypeScript 中如何处理异步编程?
解析:TypeScript 支持使用 Promise
、async/await
来处理异步操作。
示例:
async function fetchData(): Promise<string> {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
return data;
}
22. 如何在 TypeScript 中实现类型声明合并?
解析:TypeScript 允许多个同名接口进行合并,合并后的接口包含所有属性。
示例:
interface Person {
name: string;
}
interface Person {
age: number;
}
const john: Person = {
name: "John",
age: 25,
};
23. TypeScript 中的命名空间是什么?
解析:命名空间用于将相关的代码组织在一起,避免全局命名冲突。
示例:
namespace Animals {
export class Dog {
bark() {
console.log("Woof!");
}
}
}
24. 如何在 TypeScript 中使用类型守卫?
解析:类型守卫用于在运行时检查变量的类型,以确保安全地访问对象的属性。
示例:
function isString(value: any): value is string {
return typeof value === "string";
}
const value: any = "Hello";
if (isString(value)) {
console.log(value.toUpperCase());
}
25. TypeScript 中的接口与类型别名有什么区别?
解析:
- 接口用于定义对象的结构,可以被实现和扩展。
- 类型别名可以定义基本类型、联合类型和元组等,不能被扩展。
26. 如何在 TypeScript 中使用模块导入和导出?
解析:使用 export
导出模块中的变量或函数,使用 import
引入。
示例:
// math.ts
export const PI = 3.14;
export function add(a: number, b: number): number {
return a + b;
}
// app.ts
import {
PI, add } from './math';
console.log(PI);
console.log(add(2, 3));
27. TypeScript 中的可选链操作符是什么?
解析:可选链操作符(?.
)用于安全地访问嵌套对象的属性,如果中间的值为 null
或 undefined
,则返回 undefined
。
示例:
const obj = {
a: {
b: {
c: 1 } } };
const value = obj.a?.b?.c; // 1
28. TypeScript 中的非空断言操作符是什么?
解析:非空断言操作符(!
)用于告知 TypeScript 该值不会是 null
或 undefined
。
示例:
let name: string | undefined;
name = "Alice";
console.log(name!); // 断言 name 不会是 undefined
29. 如何在 TypeScript 中实现接口的继承?
解析:接口可以通过 extends
关键字继承其他接口。
示例:
interface Animal {
name: string;
}
interface Dog extends Animal {
bark(): void;
}
30. 解释 TypeScript 中的映射类型。
解析:映射类型允许通过已有类型创建新的类型。
示例:
type Person = {
name: string;
age: number;
};
type ReadOnly<T> = {
readonly [K in keyof T]: T[K];
};
type ReadOnlyPerson = ReadOnly<Person>;
31. TypeScript 中的字面量类型是什么?
解析:字面量类型用于指定变量可以是特定的值。
示例:
let direction: "left" | "right";
direction = "left"; // 合法
// direction = "up"; // 不合法
32. 如何在 TypeScript 中实现函数重载?
解析:函数重载通过定义多个函数签名来实现。
示例:
function combine(a: string, b: string): string;
function combine(a: number, b: number): number;
function combine(a: any, b: any): any {
return a + b;
}
33. TypeScript 中如何使用 Promise 的泛型?
解析:可以在 Promise
中使用泛型来指定返回值的类型。
示例:
function fetchData(): Promise<string> {
return new Promise((resolve) => {
resolve("数据");
});
}
34. 如何在 TypeScript 中实现私有和保护属性?
解析:使用 private
和 protected
关键字来定义类的私有和保护属性。
示例:
class Person {
private name: string;
protected age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
35. 解释 TypeScript 中的 this
类型。
解析:this
类型用于在类型中表示当前类的实例,通常用于链式调用。
示例:
class Chainable {
value: number;
constructor(value: number) {
this.value = value;
}
add(n: number): this {
this.value += n;
return this;
}
}
const result = new Chainable(10).add(5).add(3).value; // 18
36. TypeScript 中的类型推断和类型注解的区别是什么?
解析:
- 类型推断:TypeScript 自动推断变量的类型。
- 类型注解:手动为变量或函数指定类型。
37. 如何在 TypeScript 中处理类型不兼容?
解析:可以使用类型断言来处理类型不兼容的情况。
示例:
let value: any = "Hello";
let strLength: number = (value as string).length;
38. TypeScript 中的函数参数默认值是什么?
解析:可以为函数参数设置默认值,如果调用函数时未提供该参数,则使用默认值。
示例:
function greet(name: string = "World"): string {
return `Hello, ${
name}!`;
}
39. 解释 TypeScript 中的 Partial
类型。
解析:Partial
类型用于将对象的所有属性变为可选。
示例:
interface Person {
name: string;
age: number;
}
const updatePerson = (person: Person, updates: Partial<Person>) => {
return {