![]() TypeScript 面试题2025年03月17日 | 阅读 22 分钟 下面列出了一些最常问的TypeScript 面试题及答案。 1) 什么是 TypeScript?TypeScript 是由微软开发和维护的免费开源编程语言。它是 JavaScript 的强类型超集,可以编译为纯 JavaScript。它是一种用于应用程序规模 JavaScript 开发的语言。对于熟悉 C#、Java 和所有强类型语言的开发人员来说,TypeScript 非常容易学习和使用。 TypeScript 可以在任何浏览器、任何主机和任何操作系统上执行。TypeScript 不能直接在浏览器上运行。它需要一个编译器来编译并生成 JavaScript 文件。TypeScript 是ES6版本的 JavaScript,并添加了一些额外功能。 2) TypeScript 与 JavaScript 有什么区别?TypeScript 与 JavaScript 的区别如下:
要了解更多信息,请点击此处。 3) 为什么我们需要 TypeScript?我们需要 TypeScript 因为:
4) 列出 TypeScript 的一些特性?![]() 要了解更多信息,请点击此处。 5) 列出使用 TypeScript 的一些好处?TypeScript 具有以下优点:
6) TypeScript 有哪些缺点?TypeScript 有以下缺点:
7) TypeScript 有哪些不同的组成部分?TypeScript 主要有三个组成部分。它们是: ![]() 语言 语言包含新语法、关键字、类型注解等元素,允许我们编写 TypeScript。 Compiler TypeScript 编译器是开源的、跨平台的,并用 TypeScript 编写。它将用 TypeScript 编写的代码转换为等效的 JavaScript 代码。它对我们的 TypeScript 代码进行解析和类型检查,然后生成 JavaScript 代码。它还可以帮助将不同的文件连接成一个输出文件以及生成源映射。 语言服务 语言服务提供信息,帮助编辑器和其他工具提供更好的辅助功能,例如自动重构和 IntelliSense。 要了解更多信息,请点击此处。 8) TypeScript 是谁开发的?目前的稳定版本是多少?TypeScript 是由Anders Hejlsberg开发的,他也是 C# 语言开发团队的核心成员之一。TypeScript 于2012 年 10 月 1 日首次发布,版本号为0.8。它由 Microsoft 在Apache 2许可下开发和维护。它旨在用于大型应用程序的开发。 TypeScript 的当前稳定版本是3.2,于 2018 年 9 月 30 日发布。TypeScript 编译为可在支持 ECMAScript 2015 框架的任何浏览器上运行的简单 JavaScript 代码。它支持最新且不断发展的 JavaScript 功能。 9) 告诉我安装 TypeScript 的最低要求。或者,我们如何获取并安装 TypeScript?可以使用 Node 和 npm (Node.js 包管理器) 来安装和管理 TypeScript。要安装 TypeScript,请先确保npm已正确安装,然后运行以下命令,该命令将 TypeScript 全局安装在系统上。 它会安装一个名为"tsc"的命令行工具,该工具将用于编译我们的 TypeScript 代码。请确保我们检查系统中安装的 TypeScript 版本。 安装 TypeScript 所需的步骤如下:
要了解安装过程,请点击此处。 10) 列出 TypeScript 中的内置类型。内置数据类型也称为 TypeScript 中的原始数据类型。它们如下所示: ![]() Number 类型:用于表示数字类型的值。TypeScript 中的所有数字都存储为浮点值。 语法: let identifier: number = value; String 类型:表示存储为 Unicode UTF-16 代码的字符序列。我们通过将字符串字面量括在单引号或双引号中来在脚本中包含它们。 语法: let identifier: string = " "; Boolean 类型:用于表示逻辑值。当我们使用布尔类型时,我们只得到 true 或 false 的输出。布尔值是一个真值,它指定条件是否为真。 语法: let identifier: bool = Boolean value; Null 类型:Null 表示值为 undefined 的变量。无法直接引用 null 类型值本身。Null 类型没有用,因为我们只能为其分配 null 值。 语法: let num: number = null; Undefined 类型:它是 undefined 字面量的类型。Undefined 类型表示所有未初始化的变量。它没有用,因为我们只能为其分配 undefined 值。这种内置类型是所有类型的子类型。 语法: let num: number = undefined; Void 类型:void 是不返回任何类型值的函数的返回类型。它用于没有可用数据类型的地方。 语法: let unusable: void = undefined; 要详细了解 TypeScript 数据类型,请点击此处。 11) 什么是 TypeScript 中的变量?如何在 TypeScript 中创建变量?变量是存储位置,用于存储供程序引用和使用的值/信息。它充当程序中值的容器。它可以使用 var 关键字声明。它应在使用前声明。在 TypeScript 中声明变量时,应遵循某些规则:
我们可以通过以下四种方式之一来声明变量:
要详细了解,请点击此处。https://tpointtech.cn/typescript-variables 12) 如何编译 TypeScript 文件?以下是在将 TypeScript 文件编译为 JavaScript 时使用的命令。 例如,编译 "Helloworld.ts"。 结果将是 helloworld.js。 13) 是否可以将多个 .ts 文件合并到一个 .js 文件中?如果可以,如何实现?是的,这是可能的。为此,我们需要添加--outFILE [OutputJSFileName] 编译选项。 上面的命令将编译所有三个".ts"文件,并将结果存储在单个"comman.js"文件中。在不提供输出文件名的情况下,如下面的命令: 那么,file2.ts和file3.ts将被编译,输出将放在file1.ts中。现在我们的 file1.ts 包含 JavaScript 代码。 14) 是否可以在 .ts 文件发生实时更改时自动编译 .ts 文件?是的,可以通过使用 --watch 编译选项在 .ts 文件发生实时更改时自动编译 ".ts" 文件。 上面的命令首先将file1.ts编译为file1.js,并监视文件更改。如果检测到任何更改,它将再次编译文件。在这里,我们需要确保运行--watch选项时命令提示符不能关闭。 15) 什么是接口?请结合 TypeScript 进行解释。接口是应用程序中充当契约的结构。它定义了类必须遵循的语法,这意味着实现接口的类必须实现其所有成员。它不能被实例化,但可以被实现它的类对象引用。TypeScript 编译器使用接口进行类型检查(也称为“鸭子类型”或“结构化子类型),以确定对象是否具有特定的结构。 语法 接口只声明方法和字段。它不能用于构建任何东西。接口无需转换为 JavaScript 即可执行。它们对运行时 JavaScript 没有影响。因此,它们唯一的目的是在开发阶段提供帮助。 16) 你对 TypeScript 中的类有什么理解?列出类的一些特性。我们知道,TypeScript 是一种面向对象的 JavaScript 语言,支持类、接口等 OOP 特性。像 Java 一样,类是用于创建可重用组件的基本实体。它是一组具有共同属性的对象。类是创建对象的模板或蓝图。它是一个逻辑实体。"class" 关键字用于在 TypeScript 中声明类。 示例 类的特性是:
17) 原生 JavaScript 支持模块吗?不支持。目前,原生 JavaScript 不支持模块。要创建和使用 JavaScript 中的模块,我们需要一个外部工具,如 CommonJS。 18) TypeScript 支持哪些面向对象术语?TypeScript 支持以下面向对象术语:
19) 如何在 TypeScript 中从子类调用基类构造函数?super() 函数用于从子类调用父类或基类构造函数。 20) 如何在 TypeScript 中实现继承?继承是一种机制,用于从另一个类获取类的属性和行为。它是 OOP 语言的重要方面,能够从现有类创建新类。继承其成员的类称为基类,继承这些成员的类称为派生类。 可以通过使用 extend 关键字来实现继承。我们可以通过以下示例来理解它。 要了解更多信息,请点击此处。 21) 什么是 TypeScript 中的模块?模块是一种强大的方式,用于创建相关变量、函数、类和接口等的组。它们可以在自己的作用域内执行,而不是在全局作用域中。换句话说,在模块中声明的变量、函数、类和接口不能直接在模块外部访问。 创建模块 可以使用export关键字创建模块,并使用import关键字在其他模块中使用。 要了解更多信息,请点击此处。 22) 内部模块和外部模块有什么区别?内部模块和外部模块的区别如下:
要详细了解,请点击此处。 23) 什么是 TypeScript 中的命名空间?如何在 TypeScript 中声明命名空间?命名空间是一种用于逻辑分组功能的机制。命名空间用于维护 TypeScript 的遗留代码。它封装了共享某些关系的功能和对象。命名空间也称为内部模块。命名空间还可以包含接口、类、函数和变量,以支持一组相关功能。 注意:命名空间可以在多个文件中定义,并允许将每个文件保持为它们都定义在一个地方。这使得代码更易于维护。创建命名空间的语法 要了解更多信息,请点击此处。 24) 解释 TypeScript 中的装饰器?装饰器是一种特殊的声明,可以应用于类、方法、访问器、属性或参数。装饰器本质上是函数,它们以@expression符号为前缀,其中 expression 必须求值为一个函数,该函数将在运行时使用有关被装饰声明的信息进行调用。 TypeScript 装饰器以声明式的方式提供添加注释和元数据到现有代码的功能。装饰器是为ES7提出的实验性功能。它已经被一些 JavaScript 框架使用,包括Angular 2。装饰器在未来的版本中可能会有所变化。 要启用对装饰器的实验性支持,我们必须在命令行或 tsconfig.json 文件中启用 experimentalDecorators 编译器选项。 命令行 tsconfig.json 要了解更多信息,请点击此处。 25) 什么是 Mixins?在 JavaScript 中,Mixins 是一种构建类的可重用组件的方法,通过组合更简单的部分类(称为 mixins)来实现。 这个想法很简单,与其让类 A 继承类 B 来获取其功能,不如让函数 B 接收类 A 并返回一个具有新增功能的类。函数 B 就是一个 mixin。 26) TypeScript 类中属性/方法的默认可见性是什么?Public 是 TypeScript 类中属性/方法的默认可见性。 27) TypeScript 如何支持函数的可选参数,而在 JavaScript 中函数的每个参数都是可选的?与 JavaScript 不同,如果我们尝试在没有提供其函数签名中声明的数量和类型的情况下调用函数,TypeScript 编译器将抛出错误。要解决此问题,我们可以使用问号 ('?') 来使用可选参数。这意味着可能收到也可能未收到值的参数可以附加一个 '?' 来将其标记为可选。 因此,arg1始终是必需的,而arg2是可选参数。 注意:可选参数必须跟在必需参数后面。如果我们想让arg1可选,而不是arg2,那么我们需要更改顺序,并将 arg1 放在 arg2 之后。要了解更多信息,请点击此处。 28) TypeScript 是否支持函数重载,而 JavaScript 不支持函数重载?是的,TypeScript 支持函数重载。但实现方式有些奇怪。当我们执行 TypeScript 中的函数重载时,我们只能实现一个函数,但具有多个签名。 在上例中,前两行是函数重载声明。它有两个重载。第一个签名有一个 string 类型的参数,而第二个签名有一个 number 类型的参数。第三个函数包含实际实现,并有一个 any 类型的参数。Any 数据类型可以接受任何类型的数据。然后实现会检查所提供参数的类型,并根据提供参数的类型执行不同的代码。 29) 是否可以调试任何 TypeScript 文件?是的,这是可能的。要调试任何 TypeScript 文件,我们需要 .js 源映射文件。所以用--sourcemap标志编译 .ts 文件以生成源映射文件。 这将创建file1.js和file1.js.map。file1.js的最后一行将是对源映射文件的引用。 30) 什么是 TypeScript 定义管理器 (TSD)?为什么我们需要它?TypeScript Definition Manager (TSD) 是一个包管理器,用于直接从社区驱动的 DefinitelyTyped 存储库搜索和安装 TypeScript 定义文件。 假设我们想在 .ts 文件中使用一些 jQuery 代码。 现在,当我们尝试使用tsc编译它时,它会给出编译错误:找不到名称"$"。所以,我们需要告知 TypeScript 编译器"$"属于 jQuery。要做到这一点,TSD 就派上用场了。我们可以下载jQuery类型定义文件并将其包含在我们的.ts文件中。以下是执行此操作的步骤: 首先,安装 TSD。 在 TypeScript 目录中,通过运行以下命令创建一个新的 TypeScript 项目: 然后安装 jQuery 的定义文件。 上面的命令将下载并创建一个包含以 ".d.ts" 结尾的 jQuery 定义文件的新目录。现在,通过更新 TypeScript 文件来指向 jQuery 定义来包含定义文件。 现在,再次编译。这次将生成 js 文件而不会出现任何错误。因此,TSD 的需求帮助我们为所需的框架获取类型定义文件。 31) 什么是 TypeScript 的 Declare 关键字?我们知道,并非所有 JavaScript 库/框架都有 TypeScript 定义文件,但我们希望在 TypeScript 文件中使用它们而不会出现任何编译错误。要做到这一点,我们使用 declare 关键字。declare 关键字用于外部声明和方法,在这些声明中我们想定义一个可能存在的变量。 例如,假设我们有一个名为 myLibrary 的库,它没有 TypeScript 定义文件,并且在全局命名空间中有一个名为 myLibrary 的命名空间。如果我们想在 TypeScript 代码中使用该库,我们可以使用以下代码: TypeScript 运行时会将 myLibrary 变量分配为 any 类型。这里的问题是我们在设计时无法获得 Intellisense,但我们可以在代码中使用该库。 32) 如何从任何 .ts 文件生成 TypeScript 定义文件?我们可以使用 tsc 编译器从任何 .ts 文件生成 TypeScript 定义文件。它将生成一个 TypeScript 定义,使我们的 TypeScript 文件可重用。 33) 什么是 tsconfig.json 文件?tsconfig.json 文件是一个 JSON 格式的文件。在 tsconfig.json 文件中,我们可以指定各种选项来告知编译器如何编译当前项目。目录中存在 tsconfig.json 文件表示该目录是 TypeScript 项目的根目录。下面是一个示例 tsconfig.json 文件。 要了解更多信息,请点击此处。 34) 解释 TypeScript 中的泛型?TypeScript 泛型是一种工具,它提供了一种创建可重用组件的方式。它能够创建可以与各种数据类型而不是单一数据类型一起使用的组件。泛型在不损害性能或生产力的情况下提供类型安全。泛型允许我们创建泛型类、泛型函数、泛型方法和泛型接口。 在泛型中,类型参数写在开括号(<)和闭括号(>)之间,这使得它们成为强类型集合。泛型使用一种特殊的类型变量 <T> 来表示类型。泛型集合只包含相似类型的对象。 要了解更多信息,请点击此处。 35) TypeScript 是否支持所有面向对象原则?是的,TypeScript 支持所有面向对象原则。面向对象编程有四个主要原则:
36) 如何在 TypeScript 中检查 null 和 undefined?通过使用松散检查,我们可以同时检查 null 和 undefined。 如果我们使用严格检查,它对于设置为 null 的值始终为 true,而对于 undefined 变量则不评估为 true。 示例 输出 37) 可以在后端使用 TypeScript 吗?如果可以,如何使用?是的,我们可以在后端使用 TypeScript。我们可以通过以下示例来理解。在这里,我们选择 Node.js 并获得一些额外的类型安全以及语言带来的其他抽象。
38) "interface" 和 "type" 语句之间有什么区别?
39) 什么是 TypeScript 的外部声明 (Ambient Declarations)?何时使用它们?外部声明告知编译器其他地方存在的实际源代码。如果这些源代码在运行时不存在并且我们尝试使用它们,那么它将无警告地中断。 外部声明文件就像文档文件。如果源代码发生变化,文档也需要保持更新。如果外部声明文件未更新,我们将收到编译器错误。 外部声明允许我们安全轻松地使用现有的流行 JavaScript 库,如 jquery、angularjs、nodejs 等。 40) 什么是 TypeScript Map 文件?
41) 什么是 TypeScript 中的类型断言?类型断言在其他语言中类似于类型转换,但它不像 C# 和 Java 等语言那样执行类型检查或数据重构。类型转换具有运行时支持,而类型断言对运行时没有影响。然而,类型断言纯粹由编译器使用,并向编译器提供关于我们希望如何分析代码的提示。 示例 要了解更多信息,请点击此处。 42) TypeScript 中的 "as" 语法是什么?as 是 TypeScript 中类型断言的附加语法。引入 as 语法的原因为原始语法(<type>)与 JSX 冲突。 示例 当 TypeScript 与 JSX 一起使用时,只允许使用 as 样式的断言。 43) 什么是 JSX?可以在 TypeScript 中使用 JSX 吗?JSX 只是带有不同扩展名的 Javascript。Facebook提出了这个新扩展,以便他们能够区分 JavaScript 中 HTML 的 XML 样实现。 JSX 是一种可嵌入的XML 样语法。它旨在转换为有效的 JavaScript。JSX 因 React 框架而流行。TypeScript 支持直接嵌入、类型检查和将 JSX 编译为 JavaScript。 要使用 JSX,我们必须做两件事:
44) 什么是 Rest 参数?Rest 参数用于将零个或多个值传递给函数。它通过在参数前加上三个点字符('...')来声明。它允许函数拥有可变数量的参数,而无需使用 arguments 对象。当参数数量不确定时,它非常有用。 Rest 参数的规则
要了解更多信息,请点击此处。 45) 解释 TypeScript 中的 Enum?Enums 或枚举是 TypeScript 数据类型,它允许我们定义一组命名常量。使用枚举可以更容易地记录意图,或创建一组不同的情况。它是一组相关的数值或字符串值。 示例 46) 解释相对和非相对模块导入。
47) 什么是匿名函数?匿名函数是没有命名标识符声明的函数。这些函数在运行时动态声明。匿名函数可以像标准函数一样接受输入并返回输出。匿名函数通常在其首次创建后无法访问。 示例 48) 什么是声明合并?声明合并是编译器遵循的过程,用于合并两个或多个具有相同名称的单独声明。这个合并后的定义具有原始声明的特征。 最简单,也许最常见的声明合并类型是接口合并。在最基本的级别上,合并将两个声明的成员机械地合并到具有相同名称的单个接口中。 示例 这三个接口将合并创建一个单一的声明,如下所示: 注意:TypeScript 中并非所有合并都允许。目前,类不能与其他类或变量合并。49) 什么是 TypeScript 中的方法重写?如果子类(子类)与父类中声明的方法相同,则称为方法重写。换句话说,在派生类或子类中重新定义基类的方法。 方法重写的规则
示例 50) 什么是 Lambda/箭头函数?TypeScript 的 ES6 版本提供了定义匿名函数的简写语法,即函数表达式。这些箭头函数也称为Lambda函数。Lambda 函数是没有名称的函数。箭头函数省略了 function 关键字。 示例 在上例中,?=?> 是lambda 运算符,(a + b) 是函数体,(a: number, b: number) 是内联参数。 要了解更多信息,请点击此处。 |
我们请求您订阅我们的新闻通讯以获取最新更新。