文章目录
-
-
- Typescript篇
-
- 1. 什么是 TypeScript?与 JavaScript 的区别是什么?
- 2. TypeScript 的优点和缺点是什么?
- 3. TypeScript 中的基本类型有哪些?
- 4. 什么是 `any` 类型?何时使用?
- 5. `void`、`undefined` 和 `null` 的区别是什么?
- 6. 什么是 TypeScript 的类型推断?
- 7. TypeScript 中的 `interface` 和 `type` 有什么区别?
- 8. 如何在 TypeScript 中定义函数类型?
- 9. 什么是 TypeScript 的联合类型?
- 10. TypeScript 中的交叉类型是什么?
- 11. 什么是 TypeScript 的类型断言?
- 12. TypeScript 中的 `never` 类型有什么用?
- 13. 如何在 TypeScript 中使用枚举(Enum)?
- 14. TypeScript 中的泛型是什么?
- 15. 如何约束泛型类型?
- 16. TypeScript 中的 `keyof` 运算符有什么用?
- 17. TypeScript 中的 `in` 运算符如何使用?
- 18. 什么是 TypeScript 的条件类型?
- 19. TypeScript 中的 `infer` 关键字有什么作用?
- 20. 如何在 TypeScript 中定义可选参数?
- 21. TypeScript 中的默认参数如何定义?
- 22. TypeScript 中的接口继承如何实现?
- 23. TypeScript 中的类如何实现接口?
- 24. TypeScript 中的抽象类是什么?
- 25. TypeScript 中的 `readonly` 修饰符有什么用?
- 26. TypeScript 中的 `const` 断言是什么?
- 27. 如何在 TypeScript 中定义数组类型?
- 28. TypeScript 中的元组(Tuple)是什么?
- 29. 如何在 TypeScript 中定义对象类型?
- 30. TypeScript 中的 `unknown` 类型有什么用?
- 31. TypeScript 中的类型守卫是什么?
- 32. 如何在 TypeScript 中使用自定义类型守卫?
- 33. TypeScript 中的 `as` 和类型断言的替代方法是什么?
- 34. TypeScript 中的 `namespace` 有什么用?
- 35. 如何在 TypeScript 中声明模块?
- 36. TypeScript 中的 `declare` 关键字有什么作用?
- 37. TypeScript 中的类型兼容性如何判断?
- 38. TypeScript 中的协变和逆变是什么?
- 39. 如何在 TypeScript 中处理第三方库无类型的情况?
- 40. TypeScript 中的 `strict` 模式有什么作用?
- 41. TypeScript 中的 `noImplicitAny` 有什么用?
- 42. TypeScript 中的 `strictNullChecks` 有什么作用?
- 43. TypeScript 中的 `strictFunctionTypes` 有什么用?
- 44. 如何在 TypeScript 中定义类?
- 45. TypeScript 中的 `private` 和 `protected` 有什么区别?
- 46. TypeScript 中的静态属性如何定义?
- 47. TypeScript 中的 getter 和 setter 如何使用?
- 48. TypeScript 中的 `abstract` 方法如何实现?
- 49. TypeScript 中的 `implements` 和 `extends` 的区别?
- 50. TypeScript 中的 `mixins` 如何实现?
- 51. TypeScript 中的装饰器(Decorators)是什么?
- 52. 如何在 TypeScript 中定义方法装饰器?
- 53. TypeScript 中的类装饰器如何使用?
- 54. TypeScript 中的属性装饰器有什么用?
- 55. TypeScript 中的参数装饰器如何定义?
- 56. TypeScript 中的模块系统是什么?
- 57. 如何在 TypeScript 中使用 `export` 和 `import`?
- 58. TypeScript 中的 `type` 和 `interface` 如何选择?
- 59. TypeScript 中的 `as const` 如何影响数组?
- 60. TypeScript 中的 `Record` 工具类型有什么用?
- 61. TypeScript 中的 `Pick` 工具类型如何使用?
- 62. TypeScript 中的 `Omit` 工具类型有什么作用?
- 63. TypeScript 中的 `Partial` 工具类型如何使用?
- 64. TypeScript 中的 `Required` 工具类型有什么用?
- 65. TypeScript 中的 `ReturnType` 工具类型如何使用?
- 66. TypeScript 中的 `Parameters` 工具类型有什么作用?
- 67. TypeScript 中的 `ConstructorParameters` 有什么用?
- 68. TypeScript 中的 `InstanceType` 工具类型如何使用?
- 69. TypeScript 中的 `Exclude` 工具类型有什么作用?
- 70. TypeScript 中的 `Extract` 工具类型如何使用?
- 71. TypeScript 中的 `NonNullable` 工具类型有什么用?
- 72. TypeScript 中的 `Awaited` 工具类型如何使用?(TS 4.5+)
- 73. TypeScript 中的 `Uppercase` 工具类型有什么作用?(TS 4.1+)
- 74. TypeScript 中的 `Capitalize` 工具类型如何使用?(TS 4.1+)
- 75. TypeScript 中的映射类型是什么?
- 76. 如何在 TypeScript 中实现类型映射?
- 77. TypeScript 中的索引签名是什么?
- 78. TypeScript 中的索引查询类型如何使用?
- 79. TypeScript 中的类型别名递归有什么限制?
- 80. TypeScript 中的函数重载如何实现?
- 81. TypeScript 中的 `this` 类型有什么用?
- 82. TypeScript 中的 `callable` 类型如何定义?
- 83. TypeScript 中的构造签名是什么?
- 84. TypeScript 中的 `as` 和 `is` 的区别?
- 85. TypeScript 中的 `satisfies` 运算符有什么用?(TS 4.9+)
- 86. TypeScript 中的 `override` 关键字有什么作用?(TS 4.3+)
- 87. TypeScript 中的 `asserts` 类型断言有什么用?
- 88. TypeScript 中的 `template literal types` 是什么?(TS 4.1+)
- 89. TypeScript 中的 `keyof typeof` 如何使用?
- 90. TypeScript 中的 `as const` 和 `readonly` 的区别?
- 91. TypeScript 中的类型推断如何优化?
- 92. TypeScript 中的 `unknown` 和 `never` 的区别?
- 93. TypeScript 中的 `strictBindCallApply` 有什么用?
- 94. TypeScript 中的 `noImplicitThis` 如何使用?
- 95. TypeScript 中的 `noImplicitReturns` 有什么作用?
- 96. TypeScript 中的 `strictPropertyInitialization` 有什么用?
- 97. TypeScript 中的 `unknown` 如何转为具体类型?
- 98. TypeScript 中的 `type` 如何嵌套定义?
- 99. TypeScript 中的 `interface` 如何实现可选属性链?
- 100. TypeScript 中的类型推断如何处理函数返回值?
- 101. TypeScript 中的 `never` 如何用于穷尽检查?
- 102. TypeScript 中的 `as const` 如何影响对象嵌套?
- 103. TypeScript 中的 `Record` 如何与 `keyof` 结合?
- 104. TypeScript 中的 `Pick` 如何与联合类型结合?
- 105. TypeScript 中的 `Omit` 如何处理嵌套类型?
- 106. TypeScript 中的 `Partial` 如何与嵌套对象结合?
- 107. TypeScript 中的 `Required` 如何影响可选链?
- 108. TypeScript 中的 `ReturnType` 如何处理泛型函数?
- 109. TypeScript 中的 `Parameters` 如何提取可选参数?
- 110. TypeScript 中的 `ConstructorParameters` 如何处理抽象类?
- 111. TypeScript 中的 `InstanceType` 如何与泛型结合?
- 112. TypeScript 中的 `Exclude` 如何与对象类型结合?
- 113. TypeScript 中的 `Extract` 如何提取函数类型?
- 114. TypeScript 中的 `NonNullable` 如何与嵌套类型结合?
- 115. TypeScript 中的 `Awaited` 如何处理复杂类型?
- 116. TypeScript 中的 `Uppercase` 如何与联合类型结合?
- 117. TypeScript 中的 `Capitalize` 如何处理模板字面量?
- 118. TypeScript 中的映射类型如何添加修饰符?
- 119. TypeScript 中的索引签名如何与具体属性共存?
- 120. TypeScript 中的索引查询如何与泛型结合?
- 121. TypeScript 中的类型别名如何实现条件逻辑?
- 122. TypeScript 中的函数重载如何与泛型结合?
- 123. TypeScript 中的 `this` 类型如何与泛型结合?
- 124. TypeScript 中的 `callable` 类型如何与属性共存?
- 125. TypeScript 中的构造签名如何与泛型结合?
- 126. TypeScript 中的 `satisfies` 如何优化类型推断?
- 127. TypeScript 中的 `override` 如何与接口结合?
- 128. TypeScript 中的 `asserts` 如何与泛型结合?
- 129. TypeScript 中的模板字面量类型如何与泛型结合?
- 130. TypeScript 中的 `keyof typeof` 如何处理枚举?
- 131. TypeScript 中的类型推断如何处理嵌套函数?
- 132. TypeScript 中的 `never` 如何与联合类型结合?
- 133. TypeScript 中的 `strictBindCallApply` 如何影响泛型?
- 134. TypeScript 中的 `noImplicitThis` 如何与类结合?
- 135. TypeScript 中的 `noImplicitReturns` 如何与条件分支结合?
- 136. TypeScript 中的 `strictPropertyInitialization` 如何与构造函数结合?
- 137. TypeScript 中的 `unknown` 如何与泛型结合?
- 138. TypeScript 中的 `type` 如何与条件类型结合?
- 139. TypeScript 中的 `interface` 如何与泛型结合?
- 140. TypeScript 中的类型推断如何处理对象字面量?
- 141. TypeScript 中的 `satisfies` 如何与嵌套对象结合?
- 142. TypeScript 中的 `override` 如何与抽象类结合?
- 143. TypeScript 中的 `asserts` 如何与条件类型结合?
- 144. TypeScript 中的模板字面量类型如何与联合类型结合?
- 145. TypeScript 中的 `keyof typeof` 如何与对象字面量结合?
- 146. TypeScript 中的类型推断如何处理高阶函数?
- 147. TypeScript 中的 `never` 如何与条件类型结合?
- 148. TypeScript 中的 `strictBindCallApply` 如何与类方法结合?
- 149. TypeScript 中的 `noImplicitThis` 如何与回调结合?
- 150. TypeScript 中的 `noImplicitReturns` 如何与嵌套函数结合?
- 151. TypeScript 中的 `strictPropertyInitialization` 如何与可选属性结合?
- 152. TypeScript 中的 `unknown` 如何与联合类型结合?
- 153. TypeScript 中的 `type` 如何与映射类型结合?
- 154. TypeScript 中的 `interface` 如何与条件类型结合?
- 155. TypeScript 中的类型推断如何处理 Promise?
- 156. TypeScript 中的 `satisfies` 如何与函数类型结合?
- 157. TypeScript 中的 `override` 如何与泛型类结合?
- 158. TypeScript 中的 `asserts` 如何与对象类型结合?
- 159. TypeScript 中的模板字面量类型如何与映射类型结合?
- 160. TypeScript 中的 `keyof typeof` 如何与函数结合?
- 161. TypeScript 中的类型推断如何处理条件表达式?
- 162. TypeScript 中的 `never` 如何与映射类型结合?
- 163. TypeScript 中的 `strictBindCallApply` 如何与泛型函数结合?
- 164. TypeScript 中的 `noImplicitThis` 如何与高阶函数结合?
- 165. TypeScript 中的 `noImplicitReturns` 如何与异步函数结合?
- 166. TypeScript 中的 `strictPropertyInitialization` 如何与依赖注入结合?
- 167. TypeScript 中的 `unknown` 如何与映射类型结合?
- 168. TypeScript 中的 `type` 如何与模板字面量结合?
- 169. TypeScript 中的 `interface` 如何与映射类型结合?
- 170. TypeScript 中的类型推断如何处理递归函数?
- 171. TypeScript 中的 `satisfies` 如何与联合类型结合?
- 172. TypeScript 中的 `override` 如何与接口实现结合?
- 173. TypeScript 中的 `asserts` 如何与联合类型结合?
- 174. TypeScript 中的模板字面量类型如何与条件类型结合?
- 175. TypeScript 中的 `keyof typeof` 如何与嵌套对象结合?
-
Typescript篇
1. 什么是 TypeScript?与 JavaScript 的区别是什么?
答案解析
TypeScript 是 JavaScript 的超集,由微软开发,增加了静态类型系统和面向对象编程特性,最终编译为纯 JavaScript。
区别:
- 类型系统:TypeScript 有静态类型检查,JavaScript 无。
- 编译:TypeScript 需编译为 JavaScript 执行。
- 特性:TypeScript 支持接口、泛型等高级功能。
代码示例:
// TypeScript
let name: string = "Alice"; // 类型声明
// name = 42; // 错误:类型不匹配
// JavaScript
let name = "Alice"; // 无类型
name = 42; // 合法
应用场景:大型项目中,TypeScript 提升代码可维护性。
2. TypeScript 的优点和缺点是什么?
答案解析
优点:
- 静态类型检查减少运行时错误。
- 更好的 IDE 支持(自动补全、跳转)。
- 增强代码可读性和可维护性。
缺点:
- 学习曲线较陡。
- 需要编译步骤,增加构建时间。
- 小型项目可能显得繁琐。
代码示例:
function add(a: number, b: number): number {
return a + b;
}
// add("1", "2"); // 错误:参数类型不匹配
应用场景:团队协作、大型应用开发。
3. TypeScript 中的基本类型有哪些?
答案解析
TypeScript 包含以下基本类型:
number
、string
、boolean
、null
、undefined
。symbol
(ES6 引入)、bigint
(大整数)。any
(任意类型)、void
(无返回值)、never
(永不返回)。
代码示例:
let num: number = 42;
let str: string = "hello";
let bool: boolean = true;
let sym: symbol = Symbol("id");
let big: bigint = 100n;
let nothing: void = undefined;
let impossible: never; // 无赋值
解析:
any
关闭类型检查,谨慎使用。never
用于抛错或死循环。
4. 什么是 any
类型?何时使用?
答案解析
any
表示任意类型,关闭类型检查。
使用场景:
- 迁移旧 JavaScript 代码。
- 第三方库无类型定义。
- 动态数据类型未知。
代码示例:
let value: any = 42;
value = "hello"; // 合法
value = [1, 2, 3]; // 合法
解析:
- 滥用
any
会削弱 TypeScript 优势。
5. void
、undefined
和 null
的区别是什么?
答案解析:
- void:表示函数无返回值。
- undefined:变量声明但未赋值。
- null:主动赋值的空值。
代码示例:
function log(): void {
console.log("No return");
}
let u: undefined = undefined;
let n: null = null;
解析:
void
多用于函数返回类型。
6. 什么是 TypeScript 的类型推断?
答案解析
TypeScript 在未显式声明类型时,会根据赋值推断类型。
作用:减少冗余代码。
代码示例:
let num = 42; // 推断为 number
// num = "hello"; // 错误
const str = "hello"; // 推断为 "hello"(字面量类型)
解析:
- 推断基于初始值,
const
推断更严格。
7. TypeScript 中的 interface
和 type
有什么区别?
答案解析:
- interface:定义对象结构,可扩展、可合并。
- type:类型别名,功能更广,可定义联合类型等。
代码示例:
interface User {
name: string;
}
interface User {
age: number; // 合并
}
type UserType = {
name: string;
} & {
age: number }; // 交集
解析:
- interface 适合面向对象,
type
更灵活。
8. 如何在 TypeScript 中定义函数类型?
答案解析
函数类型可通过参数和返回值类型定义。
代码示例:
// 函数声明
function add(a: number, b: number): number {
return a + b;
}
// 函数类型
type AddFn = (a: number, b: number) => number;
const addFn: AddFn = (x, y) => x + y;
解析:
- 可使用
interface
或箭头函数语法。
9. 什么是 TypeScript 的联合类型?
答案解析
联合类型(|
)表示变量可为多种类型之一。
代码示例:
let value: string | number;
value = "hello"; // 合法
value = 42; // 合法
// value = true; // 错误
解析:
- 常用于不确定类型的场景。
10. TypeScript 中的交叉类型是什么?
答案解析
交叉类型(&
)将多个类型合并为一个类型。
代码示例:
type A = {
a: string };
type B = {
b: number };
type C = A & B;
const obj: C = {
a: "hello", b: 42 };
解析:
- 要求满足所有类型特性。
11. 什么是 TypeScript 的类型断言?
答案解析
类型断言(as
或 <>
)告诉编译器相信开发者对类型的判断。
代码示例:
let value: any = "hello";
let strLength: number = (value as string).length;
// 或
let strLength2: number = (<string>value).length;
解析:
- 常用于
any
或未知类型转换。
12. TypeScript 中的 never
类型有什么用?
答案解析
never
表示永不发生的值,如抛错或死循环。
代码示例:
function fail(): never {
throw new Error("Failed");
}
function infinite(): never {
while (true) {
}
}
解析:
- 用于类型推断和穷尽检查。
13. 如何在 TypeScript 中使用枚举(Enum)?
答案解析
枚举定义一组命名常量,常用于固定值集合。
代码示例:
enum Direction {
Up = 1,
Down,
Left,
Right,
}
let dir: Direction = Direction.Up; // 1
解析:
- 默认从 0 开始,可手动赋值。
14. TypeScript 中的泛型是什么?
答案解析
泛型允许在定义时不指定具体类型,使用时传入类型。
作用:提高代码复用性和类型安全。
代码示例:
function identity<T>(arg: T): T {
return arg;
}
let num = identity<number>(42); // 类型 number
let str = identity<string>("hello"); // 类型 string
解析:
T
是类型参数。
15. 如何约束泛型类型?
答案解析
使用 extends
限制泛型类型范围。
代码示例:
interface Lengthy {
length: number;
}
function getLength<T extends Lengthy>(item: T): number {
return item.length;
}
console.log(getLength("hello")); // 5
// getLength(42); // 错误
解析:
- 确保泛型具备特定属性。
16. TypeScript 中的 keyof
运算符有什么用?
答案解析
keyof
获取类型的所有键,生成联合类型。
代码示例:
interface User {
name: string;
age: number;
}
type UserKeys = keyof User; // "name" | "age"
let key: UserKeys = "name"; // 合法
解析:
- 常与泛型结合使用。
17. TypeScript 中的 in
运算符如何使用?
答案解析
in
用于映射类型,遍历键生成新类型。
代码示例:
type Optional<T> = {
[K in keyof T]?: T[K];
};
interface User {
name: string;
age: number;
}
type OptionalUser = Optional<User>; // { name?: string; age?: number }
解析:
- 常用于类型转换。
18. 什么是 TypeScript 的条件类型?
答案解析
条件类型(T extends U ? X : Y
)根据条件选择类型。
代码示例:
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
解析:
- 常用于类型推导。
19. TypeScript 中的 infer
关键字有什么作用?
答案解析
infer
在条件类型中推断类型变量。
代码示例:
type ReturnType<T> = T extends (...args: any) => infer R ? R : never;
function fn() {
return "hello"; }
type FnReturn = ReturnType<typeof fn>; // "hello"
解析:
- 提取函数返回类型等。
20. 如何在 TypeScript 中定义可选参数?
答案解析
使用 ?
标记参数为可选。
代码示例:
function greet(name: string, age?: number): string {
return age ? `${
name}, ${
age}` : name;
}
console.log(greet("Alice")); // "Alice"
console.log(greet("Bob", 25)); // "Bob, 25"
解析:
- 可选参数必须在必选参数后。
21. TypeScript 中的默认参数如何定义?
答案解析
使用 =
为参数设置默认值。
代码示例:
function greet(name: string = "Guest"): string {
return `Hello, ${
name}`;
}
console.log(greet()); // "Hello, Guest"
console.log(greet("Alice")); // "Hello, Alice"
解析:
- 默认参数隐式为可选。
22. TypeScript 中的接口继承如何实现?
答案解析
使用 extends
实现接口继承。
代码示例:
interface Person {
name: string;
}
interface User extends Person {
id: number;
}
const user: User = {
name: "Alice", id: 1 };
解析:
- 支持多继承:
interface A extends B, C
。
23. TypeScript 中的类如何实现接口?
答案解析
使用 implements
让类遵循接口。
代码示例:
interface Printable {
print(): void;
}
class Document implements Printable {
print() {
console.log("Printing...");
}
}
解析:
- 类必须实现所有接口成员。
24. TypeScript 中的抽象类是什么?
答案解析
抽象类(abstract
)不能实例化,定义通用行为。
代码示例:
abstract class Animal {
abstract makeSound(): void;
move() {
console.log("Moving...");
}
}
class Dog extends Animal {
makeSound() {
console.log("Woof!");
}
}
解析:
abstract
方法需子类实现。
25. TypeScript 中的 readonly
修饰符有什么用?
答案解析
readonly
使属性只读,不可修改。
代码示例:
interface Point {
readonly x: number;
readonly y: number;
}
const p: Point = {
x: 10, y: 20 };
// p.x = 30; // 错误
解析:
- 仅在编译时检查。
26. TypeScript 中的 const
断言是什么?
答案解析
as const
将对象转为只读字面量类型。
代码示例:
let obj = {
name: "Alice" } as const;
// obj.name = "Bob"; // 错误
type Name = typeof obj.name; // "Alice"
解析:
- 常用于类型收窄。
27. 如何在 TypeScript 中定义数组类型?
答案解析
数组类型可用 T[]
或 Array<T>
定义。
代码示例:
let numbers: number[] = [1, 2, 3];
let strings: Array<string> = ["a", "b"];
解析:
- 两种写法等价。
28. TypeScript 中的元组(Tuple)是什么?
答案解析
元组是固定长度和类型的数组。
代码示例:
let tuple: [string, number] = ["Alice", 25];
// tuple[0] = 42; // 错误
解析:
- 长度和类型严格约束。
29. 如何在 TypeScript 中定义对象类型?
答案解析
使用 interface
或 type
定义对象结构。
代码示例:
interface User {
name: string;
age: number;
}
const user: User = {
name: "Alice", age: 25 };
解析:
- 可选属性用
?
。
30. TypeScript 中的 unknown
类型有什么用?
答案解析
unknown
是安全的 any
,需类型检查后使用。
代码示例:
let value: unknown = 42;
// let len = value.length; // 错误
if (typeof value === "string") {
let len = value.length; // 合法
}
解析:
- 比
any
更严格。
31. TypeScript 中的类型守卫是什么?
答案解析
类型守卫通过条件判断收窄类型。
代码示例:
function process(value: string | number) {
if (typeof value === "string") {
return value.toUpperCase(); // value 是 string
}
return value.toString(); // value 是 number
}
解析:
- 常用
typeof
、instanceof
。
32. 如何在 TypeScript 中使用自定义类型守卫?
答案解析
自定义类型守卫返回类型谓词(如 x is T
)。
代码示例:
function isString(value: any): value is string {
return typeof value === "string";
}
let val: unknown = "hello";
if (isString(val)) {
console.log(val.toUpperCase()); // val 是 string
}
解析:
- 增强类型安全性。
33. TypeScript 中的 as
和类型断言的替代方法是什么?
答案解析
as
是强制断言,替代方法包括类型守卫和非空断言。
代码示例:
let value: unknown = "hello";
// 类型守卫
if (typeof value === "string") {
console.log(value.length);
}
// 非空断言
let str: string | null = "test";
console.log(str!.length);
解析:
- 避免滥用
as
。
34. TypeScript 中的 namespace
有什么用?
答案解析
namespace
组织代码,避免命名冲突(已不推荐)。
代码示例:
namespace Utils {
export function log(msg: string) {
console.log(msg);
}
}
Utils.log("Hello");
解析:
- 推荐使用 ES 模块。
35. 如何在 TypeScript 中声明模块?
答案解析
使用 declare
为外部代码声明类型。
代码示例:
declare module "my-lib" {
export function doSomething(): string;
}
import {
doSomething } from "my-lib";
console.log(doSomething());
解析:
- 用于无类型定义的库。
36. TypeScript 中的 declare
关键字有什么作用?
答案解析
declare
声明变量、函数等类型,不生成代码。
代码示例:
declare let globalVar: string;
console.log(globalVar); // 假设已存在
解析:
- 用于全局变量声明。
37. TypeScript 中的类型兼容性如何判断?
答案解析
TypeScript 使用结构类型系统,比较属性兼容性。
代码示例:
interface A {
x: number;
}
interface B {
x: number;
y: string