首页 web前端 js教程 技术面试问题 - 部分打字稿

技术面试问题 - 部分打字稿

Oct 25, 2024 am 03:20 AM

介绍

你好,你好!! :D

希望你们一切都好!

我们的真实感受:
Technical Interview Questions - Part  Typescript

我带着本系列的第二部分回来了。 ?

在本章中,我们将深入探讨我在面试过程中遇到的✨Typescript✨问题。

我的介绍会很简短,所以让我们直接开始吧!

## 问题
1. Typescript 中的泛型是什么? 是什么?
2. 接口和类型有什么区别?
3.any、null、unknown、never有什么区别?


问题 1:Typescript 中的泛型是什么? 是什么?

简短的答案是...

TypeScript 中的泛型允许我们创建可重用的函数、类和接口,这些函数、类和接口可以与多种类型一起使用,而无需指定特定类型。这有助于避免使用 any 作为包罗万象的类型。

语法 ;用于声明泛型类型,但您也可以使用 或任何其他占位符。

它是如何工作的? ​​

让我们用一个例子来分解它。

假设我有一个函数,它接受一个参数并返回一个相同类型的元素。如果我用特定类型编写该函数,它将如下所示:

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
登录后复制
登录后复制
登录后复制
登录后复制

我知道 stringData 的类型将是“string”,因为我声明了它。

Technical Interview Questions - Part  Typescript

但是如果我想返回不同的类型会怎样?

const numberData = returnElement(5);
登录后复制
登录后复制
登录后复制
登录后复制

我将收到一条错误消息,因为类型与声明的类型不同。

Technical Interview Questions - Part  Typescript

解决方案可能是创建一个新函数来返回数字类型。

function returnNumber(element: number): number {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

这种方法可行,但可能会导致重复的代码。

避免这种情况的一个常见错误是使用 any 而不是声明的类型,但这违背了类型安全的目的。

function returnElement2(element: any): any {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

但是,使用 any 会导致我们失去 Typescript 所具有的类型安全和错误检测功能。
另外,如果您在需要避免重复代码时就开始使用any,您的代码将失去可维护性。

这正是使用泛型有益的时候。

function returnGenericElement<T>(element: T): T {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

该函数将接收特定类型的元素;该类型将取代泛型并在整个运行时保持不变。

这种方法使我们能够消除重复的代码,同时保持类型安全。

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
登录后复制
登录后复制
登录后复制
登录后复制

但是如果我需要来自数组的特定函数怎么办?

我们可以将泛型声明为数组并这样写:

const numberData = returnElement(5);
登录后复制
登录后复制
登录后复制
登录后复制

那么,

function returnNumber(element: number): number {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

声明的类型将替换为作为参数提供的类型。

Technical Interview Questions - Part  Typescript

我们还可以在类中使用泛型。

function returnElement2(element: any): any {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

关于这段代码我有三点要说:

  1. add 是一个匿名箭头函数(我在第一章中讨论过)。
  2. 如果您愿意,通用名称可以命名为 甚至
  3. 由于我们还没有指定类型,所以我们无法在类内部实现操作。因此,我们需要通过声明泛型的类型来实例化类,然后实现函数。

它的外观如下:

function returnGenericElement<T>(element: T): T {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

并且,在结束这个问题之前要补充的最后一件事。
请记住,泛型是 Typescript 的一个功能。这意味着当我们将其编译为 Javascript 时,泛型将被删除。

来自

const stringData2 = returnGenericElement("Hello world");


const numberData2 = returnGenericElement(5);
登录后复制
登录后复制


function returnLength<T>(element: T[]): number {
 return element.length;
}
登录后复制
登录后复制

问题2:接口和类型有什么区别?

简短的答案是:

  1. 声明合并适用于接口,但不适用于类型。
  2. 您不能在具有联合类型的类中使用实现。
  3. 您不能将扩展与使用联合类型的接口一起使用。

关于第一点,声明合并是什么意思? ​​

让我告诉你:
我在类中使用同一个接口时定义了两次。然后,该类将合并两个定义中声明的属性。

const stringLength = returnLength(["Hello", "world"]);
登录后复制
登录后复制

类型不会发生这种情况。如果我们尝试多次定义一个类型,TypeScript 将抛出错误。

class Addition<U> {
 add: (x: U, y: U) => U;
}
登录后复制
登录后复制

Technical Interview Questions - Part  Typescript

Technical Interview Questions - Part  Typescript

关于以下几点,我们来区分并集和交集类型:

联合类型允许我们指定一个值可以是多种类型之一。当一个变量可以保存多种类型时,这非常有用。

交叉类型允许我们将类型组合为一个。它是使用 & 运算符定义的。

const operation = new Addition<number>();


operation.add = (x, y) => x + y; => We implement the function here


console.log(operation.add(5, 6)); // 11
登录后复制
登录后复制

联合类型:

function returnGenericElement<T>(element: T): T {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

交叉口类型:

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
登录后复制
登录后复制
登录后复制
登录后复制

如果我们尝试将 Implements 关键字与联合类型(例如 Animal)一起使用,TypeScript 将抛出错误。这是因为 Implements 需要单个接口或类型,而不是联合类型。

const numberData = returnElement(5);
登录后复制
登录后复制
登录后复制
登录后复制

Technical Interview Questions - Part  Typescript

Typescript 允许我们使用“工具”:

a.交叉口类型

function returnNumber(element: number): number {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

b.接口

function returnElement2(element: any): any {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
function returnGenericElement<T>(element: T): T {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

c.单一类型。

const stringData2 = returnGenericElement("Hello world");


const numberData2 = returnGenericElement(5);
登录后复制
登录后复制

当我们尝试将扩展与联合类型一起使用时,也会出现同样的问题。 TypeScript 将抛出错误,因为接口无法扩展联合类型。这是一个例子

function returnLength<T>(element: T[]): number {
 return element.length;
}
登录后复制
登录后复制

你不能扩展联合类型,因为它代表多种可能的类型,并且不清楚应该继承哪个类型的属性。

Technical Interview Questions - Part  Typescript

但是你可以扩展类型或接口。

const stringLength = returnLength(["Hello", "world"]);
登录后复制
登录后复制

此外,您可以扩展单个类型。

class Addition<U> {
 add: (x: U, y: U) => U;
}
登录后复制
登录后复制

问题 3:any、null、unknown 和 never 之间有什么区别?

简短回答:

任意=>它是一个顶级类型变量(也称为通用类型或通用超类型)。 当我们在变量中使用any时,该变量可以保存任何类型。它通常在变量的特定类型未知或预计会更改时使用。然而,使用any 并不被认为是最佳实践;建议使用泛型代替。

const operation = new Addition<number>();


operation.add = (x, y) => x + y; => We implement the function here


console.log(operation.add(5, 6)); // 11
登录后复制
登录后复制

虽然any允许调用方法之类的操作,但TypeScript编译器在此阶段不会捕获错误。例如:

function returnGenericElement<T>(element: T): T {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

您可以将任何值分配给任何变量:

function returnGenericElement(element) {
 return element;
}
登录后复制

此外,您可以将任何变量分配给另一个具有定义类型的变量:

interface CatInterface {
 name: string;
 age: number;
}


interface CatInterface {
 color: string;
}


const cat: CatInterface = {
 name: "Tom",
 age: 5,
 color: "Black",
};
登录后复制

未知 =>这种类型与任何类型一样,可以保存任何值,也被认为是顶级类型。当我们不知道变量类型时,我们会使用它,但稍后会对其进行赋值,并在运行时保持不变。未知是比任何类型都更不宽容的类型。

type dog = {
 name: string;
 age: number;
};


type dog = { // Duplicate identifier 'dog'.ts(2300)
 color: string;
};


const dog1: dog = {
 name: "Tom",
 age: 5,
 color: "Black", //Object literal may only specify known properties, and 'color' does not exist in type 'dog'.ts(2353)
};
登录后复制

直接调用未知的方法将导致编译时错误:

type cat = {
 name: string;
 age: number;
};


type dog = {
 name: string;
 age: number;
 breed: string;
};
登录后复制

Technical Interview Questions - Part  Typescript

在使用它之前,我们应该执行如下检查:

type animal = cat | dog;
登录后复制

与任何类型一样,我们可以为变量分配任何类型。

type intersectionAnimal = cat & dog;
登录后复制

但是,我们不能将未知类型分配给其他类型,只能将 any 或unknown 分配给其他类型。

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
登录后复制
登录后复制
登录后复制
登录后复制

这将向我们显示一个错误
Technical Interview Questions - Part  Typescript


空=>该变量可以保存任一类型。这意味着该变量没有值。

const numberData = returnElement(5);
登录后复制
登录后复制
登录后复制
登录后复制

尝试将任何其他类型分配给空变量将导致错误:

function returnNumber(element: number): number {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

Technical Interview Questions - Part  Typescript


从不=>我们使用此类型来指定函数没有返回值。

function returnElement2(element: any): any {
 return element;
}
登录后复制
登录后复制
登录后复制
登录后复制

结局...

我们以 Typescript 结束,

Technical Interview Questions - Part  Typescript

今天(?

我希望这对某人有帮助。

如果您有任何技术面试问题希望我解释,请随时在评论中告诉我。 ??

本周过得愉快吗?

以上是技术面试问题 - 部分打字稿的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1673
14
CakePHP 教程
1428
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C/C在JavaScript口译员和编译器中的作用 C/C在JavaScript口译员和编译器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

Python vs. JavaScript:比较用例和应用程序 Python vs. JavaScript:比较用例和应用程序 Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

See all articles