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

TS面试题

1.TS有哪些类型(对比与js)?

关键字/语法

用途

示例

any

关闭类型检查

let a: any = 4

unknown

类型安全的 any

let u: unknown = 4; if (typeof u === 'number') …

never

永不存在的值

function err(): never { throw 0; }

void

无返回值

function f(): void {}

enum / const enum

枚举

enum Color { Red = 1 }

union(联合)

“或”关系

string | number

intersection(交叉)

“且”关系

A & B

literal(字面量)

精确值

'GET' / 404 / true

readonly

只读属性

readonly x: number

? 可选属性

interface P { name?: string }

keyof

取键联合

keyof {a:1,b:2} → `'a'

typeof

取变量类型

let p = {x:1}; type T = typeof p

as 类型断言

(<HTMLElement>el).style

satisfies (4.9+)

保证表达式符合某类型并推断更精确类型

条件类型

T extends U ? X : Y

infer

在条件类型里提取子类型

映射类型

{ [K in keyof T]: T[K] }

模板字符串类型

` `user-${number}` `

2.type和interface的区别?何时用哪个?

在 90 % 的日常代码里两者可以互换;但 interface 可以同名自动合并被类实现/继承,而 type 可以做联合、交叉、元组等更复杂的复合类型。官方推荐:描述对象形状优先用 interface,需要组合、映射、条件类型时用 type

维度

interface

type

官方定位

描述“对象形状”(shape / contract)

描述任意“类型表达式”

能否同名合并(Declaration Merging)

✅ 自动合并
interface A {x:1}
interface A {y:2}{x:1,y:2}

❌ 重复定义即报错

继承 / 实现

extends 另一 interface
implements by class

❌ 不能被类实现

联合类型(|)

❌ 不支持

type T = A|B

交叉类型(&)

❌ 不支持

type T = A & B

元组 / 映射 / 条件 / infer

❌ 不支持

✅ 支持全部高级类型体操

基本对象描述

interface P {name:string}

type P = {name:string}

递归类型

✅ 支持

✅ 支持

运行时表现

完全擦除,无差异

完全擦除,无差异

对象、继承、合并用 interface;其余复杂场景用 type

3.什么是类型断言?如何使用?

类型断言(Type Assertion) 就是「开发者比编译器更懂类型,手动告诉它」的语法糖;它只在 编译阶段 起作用,运行时无任何效果

语法

示例

备注

尖括号(不推荐 JSX 环境)

<HTMLElement>document.querySelector('#app')

易与 JSX 混淆

as 写法(推荐)

document.querySelector('#app') as HTMLElement

通用、可读性高

4.什么是泛型

泛型是一种在定义函数、接口或类时不预先指定具体类型,而在使用时再指定类型的特性

T(或其他大写字母)作为“泛型”占位符,让同一段代码能够复用于不特定的数据类型

// 一颗星 T:传入什么类型,就返回什么类型
function echo<T>(value: T): T {return value;
}echo<string>('hello'); // T 点亮成 string
echo<number>(42);      // T 点亮成 number

5.装饰器是什么,如何使用?

装饰器是一种特殊类型的声明,可以附加到类、方法、访问符、属性或参数上。本质是函数

// 类装饰器
function sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@sealed
class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}// 方法装饰器
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {let originalMethod = descriptor.value;descriptor.value = function(...args: any[]) {console.log(`Calling ${propertyKey} with`, args);return originalMethod.apply(this, args);};return descriptor;
}class Calculator {@logadd(x: number, y: number) {return x + y;}
}

6.讲解一下ts的枚举?

TypeScript 枚举在编译期生成一个键值双向映射对象(数字 enum)或单向对象(字符串 enum),既能当类型又能当;使用 const enum 可彻底消除运行时开销

TypeScript 中的枚举(Enums)是一种特殊的对象类型,它允许我们定义一组命名常量。这使得代码更具可读性和可维护性,尤其是在处理一组固定的值时非常有用。

enum Direction {Up,Down,Left,Right,
}
console.log(Direction.Up); // 输出 0

enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT",
}
console.log(Direction.Up); // 输出 "UP"
http://www.xdnf.cn/news/1203643.html

相关文章:

  • 分布式IO详解:2025年分布式无线远程IO采集控制方案选型指南
  • simple-mock-proxy,自动拾取后端接口数据,生成本地mock接口与数据
  • idea启动java应用报错
  • keepalived原理及实战部署
  • vue怎么实现导入excel表功能
  • 最新!Polkadot 更新 2025 路线图
  • C++-关于协程的一些思考
  • ERC20 和 XCM Precompile|详解背后技术逻辑
  • 【Kotlin】如何实现静态方法?(单例类、伴生对象、@JvmStatic)
  • Android中应用进程中Binder创建机制
  • VUE2 学习笔记11 脚手架
  • 从0到500账号管理:亚矩阵云手机多开组队与虚拟定位实战指南
  • 数据结构之顺序表链表栈
  • 分享一个脚本,从mysql导出数据csv到hdfs临时目录
  • CFIHL: 水培生菜的多种叶绿素 a 荧光瞬态图像数据集
  • 雷达系统设计学习:自制6GHz FMCW Radar
  • 深入解析 Spring 获取 XML 验证模式的过程
  • 可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)
  • 速度革命 Kingston FURY PCIe 5.0 NVMe装机体验
  • 第四章:分析 Redis 性能高原因和核心字符串类型命令
  • 15-C语言:第15天笔记
  • Nginx 四层(stream)反向代理 + DNS 负载均衡
  • Java面试深度剖析:从JVM到云原生的技术演进
  • JVM 内存共享区域详解
  • 解决cordova编译安卓提示Cloud not find XXXX.aar
  • windows内核研究(异常-CPU异常记录)
  • C++ 内存管理
  • 图像轮廓与凸包
  • 数据赋能(345)——数据整合——全面集成原则
  • 《 服务注册发现原理:从 Eureka 到 Nacos 的演进》