当前位置: 首页 > news >正文

前端面试热点题目——typescript篇

在TypeScript面试中,面试官通常会考察你对TypeScript特性的理解、类型系统的掌握、以及在实际项目中的应用能力。以下是一些热点题目及其相应的代码示例,旨在帮助你准备TypeScript相关的面试。

1. 类型别名与接口的区别及使用场景

问题:请解释类型别名(Type Aliases)和接口(Interfaces)之间的主要区别,并给出使用场景。

答案

  • 类型别名:用于给类型起一个新名字,可以是基本类型、联合类型、交叉类型、数组类型等。它更灵活,但不能被extends或implements(仅当类型别名是对象或类类型时,可以用在extends或implements的右侧)。
  • 接口:主要用于定义对象的形状,它可以包含方法(抽象或具体)、属性等。接口可以被extends和implements。

代码示例

// 类型别名  
type Name = string;  
type UserInfo = {  name: Name;  age: number;  
};  // 接口  
interface IPerson {  name: string;  greet(phrase: string): void;  
}  class Person implements IPerson {  name: string;  constructor(name: string) {  this.name = name;  }  greet(phrase: string) {  console.log(`${phrase}, ${this.name}!`);  }  
}  // 使用场景:当你需要一个简单的类型引用时,使用类型别名;当需要定义对象形状或继承时,使用接口。

2. 泛型(Generics)的使用

问题:请解释什么是泛型,并给出一个使用泛型的函数示例。

答案:泛型是一种在编译时定义类型但在运行时保持灵活性的方法。它允许你编写灵活、可重用的函数、类或接口。

代码示例

// 泛型函数示例  
function identity<T>(arg: T): T {  return arg;  
}  let output = identity<string>("myString");  // 类型参数为string  
let outputNum = identity(42);               // 类型参数为number,TypeScript会自动推断  // 泛型接口示例  
interface GenericIdentityFn<T> {  (arg: T): T;  
}  let myIdentity: GenericIdentityFn<number> = identity;

3. 枚举(Enumerations)与常量(Constants)的区别

问题:请阐述枚举(Enumerations)与常量(Constants)之间的主要区别。

答案

  • 枚举:是一种特殊的类,它包含了一组命名的常量。枚举成员可以是数字、字符串甚至是计算值(只要成员之间有明确的差异)。枚举提供了一种描述一组命名常量的方法,使得代码更加清晰。
  • 常量:通常使用const关键字定义,表示其值在初始化之后不可更改。它可以是任何类型。

代码示例

enum Color {Red, Green, Blue};  
let c: Color = Color.Green;  const PI = 3.14;  
// PI = 3.15; // 这会引发编译错误

4. TypeScript中类属性的初始化时机

问题:在TypeScript中,类属性的初始化时机是怎样的?

答案

  • 类属性可以在声明时直接初始化(称为实例属性初始化器)。
  • 也可以在构造函数中初始化。
  • 如果类属性是静态的,则它可以在类体内部直接初始化。

代码示例

class Person {  // 实例属性初始化器  name: string = "John";  age: number;  // 静态属性  static staticProperty = "I am static";  constructor(age: number) {  this.age = age;  }  
}  console.log(new Person(30).name); // John  
console.log(Person.staticProperty); // I am static

5.解释一下 TypeScript 中的 interface 和 type 有什么区别?

答案概述

  • interface 通常用于定义对象的形状,可以被多次声明并合并,支持继承其他接口。
  • type 更为灵活,支持联合类型、元组、字面量类型等复杂类型,但不能被多次声明(除非使用类型别名)。

示例代码

// Interface 示例  
interface User {  name: string;  age: number;  
}  interface UserWithEmail extends User {  email: string;  
}  const user: UserWithEmail = {  name: 'John Doe',  age: 30,  email: 'john@example.com'  
};  // Type 示例  
type Name = string;  
type Age = number;  
type UserType = {  name: Name;  age: Age;  email?: string; // 可选属性  
};  const anotherUser: UserType = {  name: 'Jane Doe',  age: 25  
};

4. TypeScript 中如何声明一个模块?

答案概述
在 TypeScript 中,模块是用来封装变量、函数、类、接口等对象的容器。

示例代码

math.ts

export function add(a: number, b: number): number {  return a + b;  
}  export function subtract(a: number, b: number): number {  return a - b;  
}

main.ts

import { add, subtract } from './math';  console.log(add(1, 2)); // 输出 3  
console.log(subtract(5, 3)); // 输出 2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【高阶数据结构】二叉树的创建、存储方式(顺序与链式)、遍历方法(递归与非递归)(精美图解+完整代码)
  • 握手的方式展现人的性格及行为倾向
  • 请解释Java中的线程局部变量的作用和使用场景。什么是Java中的Lock接口?它与synchronized关键字有何区别?
  • yum源配置与静态配置地址
  • 华为OD机试真题-数组拼接-2023年OD统一考试(B卷)
  • SpringBoot 时间格式校验问题
  • MybatisPlus 快速入门
  • 基于JAVA+SpringBoot+Vue的工程教育认证的计算机课程管理平台
  • mac 电脑 git credential osxkeychain问题
  • 代码随想录算法训练营第二十二天| 491. 递增子序列、46. 全排列、47. 全排列Ⅱ
  • HTTP1.0 到 HTTP3.0 的优化
  • Linux常用命令合集
  • 免费的 Mac 应用清理工具Pearcleaner v3.8.6
  • 透视表支持自定义聚合公式,新增字体管理功能,DataEase开源BI工具v2.10 LTS版本发布
  • FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑
  • [deviceone开发]-do_Webview的基本示例
  • Apache的80端口被占用以及访问时报错403
  • HashMap剖析之内部结构
  • JavaScript DOM 10 - 滚动
  • Less 日常用法
  • python3 使用 asyncio 代替线程
  • Redis的resp协议
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 基于web的全景—— Pannellum小试
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 译有关态射的一切
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #LLM入门|Prompt#3.3_存储_Memory
  • $.ajax()参数及用法
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (二)windows配置JDK环境
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (离散数学)逻辑连接词
  • (六)DockerCompose安装与配置
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (译)2019年前端性能优化清单 — 下篇
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)创业的注意事项
  • (转载)Linux 多线程条件变量同步
  • ./configure,make,make install的作用
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net IOC框架入门之一 Unity
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net反编译工具
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /proc/stat文件详解(翻译)
  • @media screen 针对不同移动设备
  • @Transactional 参数详解
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [.net]官方水晶报表的使用以演示下载
  • [04]Web前端进阶—JS伪数组