Typescript 面试题及其答案与代码示例

1.什么是 TypeScript,它与 JavaScript 有何不同。

答:TypeScript 是 JavaScript 的超集,为该语言添加了静态类型。它允许开发人员定义变量、函数参数和返回值的数据类型,这有助于在编译时而不是运行时捕获错误。这是一个例子:

javascript 复制代码
function greet(name: string): string {
  return `Hello, ${name}!`;
}
const message: string = greet('John');
console.log(message); // Output: "Hello, John!"

2.解释 TypeScript 中静态类型的概念及其好处。
答案:TypeScript 中的静态类型可以在开发过程中指定变量、函数参数和返回值的数据类型。这有助于及早捕获与类型相关的错误,从而提高代码质量和可维护性。

答案:好处是拥有更好的代码文档、增强的工具支持以及提高的开发人员生产力。

3.使用 TypeScript 相对于纯 JavaScript 有什么好处?

答:TypeScript 提供了多种好处,包括静态类型、更好的代码分析和工具支持、改进的代码可读性、早期错误检测、更轻松的代码重构以及增强的代码文档。它还使开发人员能够编写更易于维护和扩展的应用程序。

4.TypeScript 中的接口是什么?举个例子。

答:TypeScript 中的接口定义了对象结构的契约,指定其属性和方法的名称和类型。它们促进强大的类型检查并实现更好的代码组织

javascript 复制代码
interface Person {
  name: string;
  age: number;
}
function greet(person: Person): string {
  return `Hello, ${person.name}! You are ${person.age} years old.`;
}
const john: Person = { name: 'John', age: 30 };
const message: string = greet(john);
console.log(message); // Output: "Hello, John! You are 30 years old."

5.如何在 TypeScript 的接口中定义可选属性?

答:您可以使用 ? 在接口中定义可选属性。属性名称后面的修饰符。可选属性可能存在于实现该接口的对象中,也可能不存在。

javascript 复制代码
interface Person {
  name: string;
  age?: number;
}
const john: Person = { name: 'John' };
const jane: Person = { name: 'Jane', age: 25 };

6.解释 TypeScript 中联合类型的概念。

答:联合类型允许一个变量有多种类型。它通过使用 | 来表示类型之间的符号。这允许变量存储任何指定类型的值。

javascript 复制代码
function test(id: number | string): void {
  console.log(`ID: ${id}`);
}
test(123); // Output: "ID: 123"
test('abc'); // Output: "ID: abc"

7.TypeScript 中的类型断言是什么?

答:当无法自动推断类型时,TypeScript 中的类型断言允许您显式告诉编译器变量的类型。这是使用 或 as type 语法实现的。

javascript 复制代码
let length: any = '5';
let numberLength: number = <number>length; // Using <type> syntax
let stringLength: number = length as number; // Using "as type" syntax

8.如何在 TypeScript 中定义具有可选参数和默认参数的函数?

答:您可以使用 ? 定义带有可选参数和默认参数的函数。可选参数的修饰符以及为参数分配默认值。

javascript 复制代码
function test(name: string, message: string = 'Hello', times?: number): void {
  for (let i = 0; i < (times || 1); i++) {
    console.log(`${message}, ${name}!`);
  }
}
test('John'); // Output: "Hello, John!"
test('Jane', 'Hi'); // Output: "Hi, Jane!"
test('Tom', 'Hey', 3); // Output: "Hey, Tom!", "Hey, Tom!", "Hey, Tom!"

9.TypeScript 中的泛型是什么?

答:泛型指的是在定义函数/接口/类型时,不预先指定具体的类型,而是在使用的时候在指定类型限制的一种特性。

可以把泛型理解为代表类型的参数,我们希望传入的值是什么类型,返回的值就是什么类型,传入的值可以是任意的类型,这时候就可以用到 泛型

,如果使用 any 的话,就失去了类型检查的意义

javascript 复制代码
function createArray1(length: any, value: any): Array<any> {
    let result: any = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

let result = createArray1(3, 'x');
console.log(result);

// 最傻的写法:每种类型都得定义一种函数
function createArray2(length: number, value: string): Array<string> {
    let result: Array<string> = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

//使用泛型
// 有关联的地方都改成 <T>
function createArray<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}
// 使用的时候再指定类型
let result = createArray<string>(3, 'x');
// 也可以不指定类型,TS 会自动类型推导
let result2 = createArray(3, 'x');
console.log(result);

10.解释 TypeScript 中的"keyof"关键字

答:TypeScript 中的"keyof"关键字是一个类型运算符,它返回表示对象键的文字类型的联合。它允许您对对象键执行类型安全操作

javascript 复制代码
interface Person {
  name: string;
  age: number;
}
type PersonKeys = keyof Person; // "name" | "age"

11.TypeScript 中的类型保护是什么?

类型防护是 TypeScript 表达式,它在运行时检查变量的类型,并允许您根据类型执行不同的操作。它们可以实现更好的类型推断,并提供一种更有效地处理联合类型的方法。

12.TypeScript 中条件类型的概念?

答:TypeScript 中的条件类型允许您创建依赖于条件的类型。它们用于根据类型之间的关系执行类型推断。

javascript 复制代码
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function add(a: number, b: number): number {
  return a + b;
}
type AddReturnType = ReturnType<typeof add>; // number

13.TypeScript 中的"只读"实用程序类型是什么?它是如何工作的?

答:TypeScript 中的"Readonly"实用程序类型用于使现有类型的所有属性变为只读。它可以防止对象创建后修改其属性。

javascript 复制代码
interface Person {
  readonly name: string;
  age: number;
}
const john: Readonly<Person> = { name: 'John', age: 30 };
john.age = 31; // Error: Cannot assign to 'age' because it is a read-only property.

14.解释 TypeScript 中的"Pick"实用程序类型。

答:TypeScript 中的"Pick"实用程序类型允许您通过从现有类型中选择特定属性来创建新类型。它有助于创建现有类型的子集。

javascript 复制代码
interface Person {
  name: string;
  age: number;
  city: string;
}
type PersonInfo = Pick<Person, 'name' | 'age'>;
const john: PersonInfo = { name: 'John', age: 30 };

15...TypeScript 中的"Omit"实用程序类型是什么?

答:TypeScript 中的"Omit"实用程序类型允许您通过从现有类型中排除特定属性来创建新类型。它有助于创建删除了某些属性的类型。

javascript 复制代码
interface Person {
  name: string;
  age: number;
  city: string;
}
type PersonWithoutCity = Omit<Person, 'city'>;
const john: PersonWithoutCity = { name: 'John', age: 30 };

16.TypeScript 中的"条件映射类型"是什么?

答:条件映射类型将条件类型和映射类型结合起来,根据条件执行类型转换。它们允许您根据现有类型的属性创建动态类型。

javascript 复制代码
interface Person {
  name: string;
  age: number;
}
type MappedConditional<T> = {
  [K in keyof T]: T[K] extends number ? string : T[K];
};
const john: MappedConditional<Person> = { name: 'John', age: '30' };

17.条件类型中"keyof"和"in"关键字的用途是什么?

答:条件类型中的"keyof"关键字用于获取对象类型的键的并集。它允许您以类型安全的方式使用对象的键。"in"关键字检查属性键是否存在于从"keyof"获得的键的并集中。

javascript 复制代码
type CheckKey<T, K extends keyof T> = K extends 'name' ? true : false;
interface Person {
  name: string;
  age: number;
}
type IsNameKey = CheckKey<Person, 'name'>; // Result: true
type IsCityKey = CheckKey<Person, 'city'>; // Result: false

18.解释条件类型中的"infer"关键字。

答:条件类型中的"infer"关键字用于从条件类型中的另一种类型推断出类型。它允许您捕获类型并将其分配给类型变量。

javascript 复制代码
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function add(a: number, b: number): number {
  return a + b;
}
type AddReturnType = ReturnType<typeof add>; // Result: number

19.TypeScript 中的"keyof"和"typeof"关键字有何用途?

答:"keyof"关键字用于获取对象类型的键的并集,"typeof"关键字用于获取值的类型。

javascript 复制代码
interface Person {
  name: string;
  age: number;
}
type PersonKeys = keyof Person; // Result: "name" | "age"
const john = { name: 'John', age: 30 };
type JohnType = typeof john; // Result: { name: string, age: number }

20.TypeScript 中的"const 断言"是什么?

答:TypeScript 中的"Const 断言"允许您通知编译器特定的文字表达式应被视为文字而不是扩展类型。

javascript 复制代码
function getConfig() {
  const config = {
    apiUrl: 'https://api.example.com',
    timeout: 5000,
  } as const;
  return config;
}
const config = getConfig();

21.解释 TypeScript 条件类型中的"keyof T extends K"构造。

答:TypeScript 条件类型中的"keyof T extends K"构造用于使用"extends"关键字根据指定条件过滤对象类型的键。

javascript 复制代码
type FilterProperties<T, K> = {
  [P in keyof T as T[P] extends K ? P : never]: T[P];
};
interface Person {
  name: string;
  age: number;
  email: string;
}
type StringProperties = FilterProperties<Person, string>;
// Result: {
//   name: string;
//   email: string;
// }
type NumberProperties = FilterProperties<Person, number>;
// Result: {
//   age: number;
// }

22.TypeScript 中的"mixins"是什么?

答:TypeScript 中的 Mixins 允许您通过将某个类与一个或多个其他类组合来向该类添加行为。它支持代码重用和组合。

javascript 复制代码
class Printable {
  print() {
    console.log(this.toString());
  }
}
class MyObject {
  constructor(private name: string) {}
  toString() {
    return `Object: ${this.name}`;
  }
}
interface MyObject extends Printable {}
const myObj = new MyObject('example');
myObj.print(); // Output: "Object: example"

23.解释 TypeScript 中"声明合并"的概念。

答:TypeScript 中的"声明合并"是编译器将同一实体的多个声明合并到单个定义中的过程。它允许您扩展接口、函数、类和枚举。

javascript 复制代码
interface Person {
  name: string;
}
interface Person {
  age: number;
}
const john: Person = { name: 'John', age: 30 };
console.log(john); // Output: { name: 'John', age: 30 }
相关推荐
Jinxiansen02113 小时前
Vue 3 实战:【加强版】公司通知推送(WebSocket + token 校验 + 心跳机制)
前端·javascript·vue.js·websocket·typescript
龚思凯4 小时前
TypeScript 中 typeof 的全面解析:从基础用法到高级技巧
前端·typescript
jstart千语5 小时前
【vue3学习】vue3入门
前端·javascript·vue.js·typescript·vue
struggle202511 小时前
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
数据库·typescript·neo4j
狂炫一碗大米饭17 小时前
如何在 TypeScript 中使用类型保护
typescript
码农之王1 天前
(一)TypeScript概述和环境搭建
前端·后端·typescript
蚂小蚁1 天前
从DeepSeek翻车案例看TypeScript类型体操的深层挑战
typescript·deepseek·trae
在人间耕耘2 天前
鸿蒙应用开发:WebSocket 使用示例
typescript
在人间耕耘2 天前
uni-app/uniappx 中调用鸿蒙原生扫码能力的实践
typescript
海的诗篇_2 天前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript