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

1.什么是 TypeScript,它与 JavaScript 有何不同。
答:TypeScript 是 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 中的接口定义了对象结构的契约,指定其属性和方法的名称和类型。它们促进强大的类型检查并实现更好的代码组织

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

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

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

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 语法实现的。

let length: any = '5';
let numberLength: number = <number>length; // Using <type> syntax
let stringLength: number = length as number; // Using "as type" syntax

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

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

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 的话,就失去了类型检查的意义

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”关键字是一个类型运算符,它返回表示对象键的文字类型的联合。它允许您对对象键执行类型安全操作

interface Person {
  name: string;
  age: number;
}
type PersonKeys = keyof Person; // "name" | "age"

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

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

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”实用程序类型用于使现有类型的所有属性变为只读。它可以防止对象创建后修改其属性。

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”实用程序类型允许您通过从现有类型中选择特定属性来创建新类型。它有助于创建现有类型的子集。

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”实用程序类型允许您通过从现有类型中排除特定属性来创建新类型。它有助于创建删除了某些属性的类型。

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

16.TypeScript 中的“条件映射类型”是什么?
答:条件映射类型将条件类型和映射类型结合起来,根据条件执行类型转换。它们允许您根据现有类型的属性创建动态类型。

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”获得的键的并集中。

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”关键字用于从条件类型中的另一种类型推断出类型。它允许您捕获类型并将其分配给类型变量。

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”关键字用于获取值的类型。

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 断言”允许您通知编译器特定的文字表达式应被视为文字而不是扩展类型。

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”关键字根据指定条件过滤对象类型的键。

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 允许您通过将某个类与一个或多个其他类组合来向该类添加行为。它支持代码重用和组合。

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 中的“声明合并”是编译器将同一实体的多个声明合并到单个定义中的过程。它允许您扩展接口、函数、类和枚举。

interface Person {
  name: string;
}
interface Person {
  age: number;
}
const john: Person = { name: 'John', age: 30 };
console.log(john); // Output: { name: 'John', age: 30 }
### 回答1: 1. TypeScript 是什么?为什么要使用它? TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,增加了静态类型、类、接口、命名空间、泛型等特性。使用TypeScript可以提高代码的可维护性和可读性,并且可以减少类型错误,加强代码的稳定性。 2. TypeScript 中的接口是什么?如何使用接口? TypeScript中的接口是一种抽象的数据类型,它描述对象的行为和结构。使用接口可以规范代码,使得代码更加可读可维护。定义一个接口可以使用interface关键字,如下所示: ``` interface Person { name: string; age: number; sayHello(): void; } ``` 3. TypeScript 中的类是什么?如何使用类? TypeScript中的类是一种面向对象的编程概念,它是一个模板或者蓝图,用来创建对象的。使用类可以将相关的数据和行为封装在一起,提高代码的可读性和可维护性。定义一个类可以使用class关键字,如下所示: ``` class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } sayHello() { console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`); } } ``` 4. TypeScript 中的泛型是什么?如何使用泛型? TypeScript中的泛型是一种抽象的数据类型,它可以用来描述不同类型之间的关系。使用泛型可以提高代码的复用性和可读性,减少类型错误。定义一个泛型可以使用<>符号,如下所示: ``` function identity<T>(arg: T): T { return arg; } ``` 5. TypeScript 中的声明文件是什么?如何使用声明文件? TypeScript中的声明文件是一种特殊的文件,用来描述已有的JavaScript代码库的类型信息。使用声明文件可以将已有的JavaScript代码库引入到TypeScript项目中,并且可以获得类型检查和代码提示。声明文件的后缀名一般为".d.ts",例如jQuery的声明文件为"jquery.d.ts"。使用声明文件可以使用三斜线指令或者使用import语句,如下所示: ``` /// <reference path="jquery.d.ts" /> import * as $ from "jquery"; ``` 以上是一些常见的TypeScript面试题,希望能对你有所帮助。 ### 回答2: TypeScript是一种开源的面向对象编程语言,它是JavaScript的一个超集,由Microsoft发布。下面我将回答一些与TypeScript相关的面试题。 1. TypeScript有哪些优势? TypeScript相比JavaScript具有更严格的类型检查、更好的代码提示和自动完成、更好的可读性和可维护性,以及更好的工具支持。此外,TypeScript还支持最新的ECMAScript标准,并且能够编译为可在任何浏览器中运行的JavaScript代码。 2. TypeScript中的数据类型有哪些? TypeScript中有基本类型(如number、boolean、string、null、undefined等),以及对象类型(如object、array、function等)。此外,TypeScript还支持自定义类型。 3. 如何定义一个类并创建其实例? 可以使用class关键字定义一个类,然后使用new关键字创建其实例。例如: ``` class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } } let person = new Person("Alice", 25); ``` 4. 如何定义接口和使用接口定义对象类型? 可以使用interface关键字定义一个接口,并且可以使用接口来定义对象的类型。例如: ``` interface Point { x: number; y: number; } function printPoint(point: Point) { console.log("x:", point.x); console.log("y:", point.y); } let point = { x: 10, y: 20 }; printPoint(point); ``` 5. 如何使用泛型? 在TypeScript中,可以使用泛型来增加代码的灵活性。例如: ``` function identity<T>(arg: T): T { return arg; } let output = identity<string>("Hello"); console.log(output); ``` 以上是对一些TypeScript面试题的简短回答,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值