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

TypeScript 中的 typeof

文章目录

  • 一、TypeScript 中的 typeof
  • 二、使用场景
    • 1. 从对象推导类型,避免重复
    • 2. 配合 keyof 做字段校验
    • 3. 配合工具类型快速生成不同形态的类型
    • 4. 对类使用 typeof,拿到构造函数类型
    • 5. 固定枚举值 + 字面量联合类型
    • 6. 自动推导 API 返回值类型
  • 三、总结

一、TypeScript 中的 typeof

typeof 是 TypeScript 中的一个类型工具(本文章只讨论typeof在TypeScript中的用法,不讨论在JavaScript中的用法),我认为最大的作用就是:在「值」和「类型」之间架起桥梁,让类型可以自动与真实数据保持同步。

特点:

  1. 操作数仍是一个值(变量、常量)
  2. 返回的是一个类型,而不是字符串
  3. 只能用在类型位置(如 type 声明里)

举个栗子:

const user = { name: 'HopeBearer', age: 21 }// UserType 的类型等同于 { name: string; age: number }
type UserType = typeof user;const antherUser: UserType = {name: 'Retrouvailles',age: 21
}

二、使用场景

1. 从对象推导类型,避免重复

当我们写配置对象、接口返回值时,可以直接用 typeof 获取类型。

// config.ts
export const config = {host: 'localhost',port: 3306,username: 'HopeBearer',password: 'root123456'
}// db.ts
import { config } from './config'
function connectionToDatabase(Cfg: typeof config) {console.log('Conneting to:', Cfg.host, cfg.port)
}

这样写的好处就是避免手写冗长类型,config 改了类型也自动更新

2. 配合 keyof 做字段校验

想校验传入的key是否是对象里的合法字段

const userProfile = {id: 1,username: 'hopebearer',age: 21
}type UserProfileKeys = keyof typeof userProfile; // 'id' | 'username' | 'age'
function isValidKey(key: string): key is UserProfileKeys {return ['id', 'username', 'age'].includes(key);
}const testKey = 'username';
if (isValidKey(testKey)) {console.log(`key ${testKey} is valid!`)
}

3. 配合工具类型快速生成不同形态的类型

后端接口字段都可选,前端展示需要必填;有时需要只读视图。

const userFromAPI = {id: 1,name: 'hopebearer',age: 21
}
type User = typeof userFromAPI;// 可选参数:更新接口
type UserUpdatePayload = Partial<User>;// 只读参数:详情页视图
type ReadonlyUser = Readonly<User>;const payload: UserUpdatePayload = { name: 'newName' };
const readonlyUser: ReadonlyUser = userFromAPI;
// readonlyUser.name = 'test' // 报错 

4. 对类使用 typeof,拿到构造函数类型

想写一个工厂函数,根据传入的类动态创建实例。

class Dog {name: 'Dog';bark() { console.log('woof!') }
}type DogConstructor = typeof Dog; // 得到构造函数类型function createAnimal(Ctor: DogConstructor) {return new Ctor();
}const dog = createAnimal(Dog);
dog.bark();

5. 固定枚举值 + 字面量联合类型

有一个角色数组,只能使用固定值。

const roles = ['admin', 'editor', 'viewer'] as const;type Role = typeof roles[number]; // 'admin' | 'editor' | 'viewer'function setUserRole(role: Role) {console.log('Role set to:', role)
}setUserRole("admin"); // 正常执行
setUserRole("root");  // 报错

6. 自动推导 API 返回值类型

避免手写返回值类型,保证类型和真实数据一致。

async function fetchUser() {return {id: 1,name: "HopeBearer",age: 21}
}// 根据返回值类型type User = Awaited<ReturnType<typeof fetchUser>>;async function example() {const user: User = await fetchUser();console.log(user.name);
}

三、总结

搭配工具用途
keyof提取对象键名
Partial / Readonly / Required动态生成可选、只读或必选类型
ReturnType / Awaited提取函数返回值及 Promise 内部类型
as const + typeof + [number]固定数组 → 联合类型(常用于枚举)
typeof 对类使用得到构造函数类型(常用于工厂函数)
http://www.dtcms.com/a/299554.html

相关文章:

  • 【17】C# 窗体应用WinForm ——【文本框TextBox、富文本框RichTextBox 】属性、方法、实例应用
  • SpringBoot总结
  • 秋招Day19 - 分布式 - 限流
  • VUE2 学习笔记7 v-model、过滤器
  • 各种前端框架界面
  • ARM SMMUv3控制器注册过程分析(八)
  • odoo代码分析(一)
  • 以太坊下一阶段的关键——隐私
  • 根本是什么
  • Transformer:颠覆NLP的自注意力革命
  • ts-node 深入全面讲解
  • nginx一个域名下部署多套前端项目
  • 松茸第一品牌菌贝品质把控对行业的影响分析
  • haproxy配置详解
  • mysql查找数据库表中某几个连续的编号中中断的编号
  • RustFS for .NET 演示项目深度解析:构建 S3 兼容的分布式存储应用
  • 二次函数图像动画展示
  • 雨雪雾冰全预警:交通气象站为出行安全筑起“隐形防护网”
  • 【愚公系列】《MIoT.VC》003-构建基本仿真工作站(组件的属性、行为、视频展示)
  • Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
  • inversify
  • 【web大前端】001_前端开发入门:创建你的第一个网页
  • 0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)
  • 【智能协同云图库】第三期:实现用户上传图片及审核功能、使用模板方法模式优化上传图片功能、使用 Jsoup 实现批量抓取和上传图片功能
  • 掌握Gemini-2.5:现代AI开发中实用应用的综合指南
  • 2025最新软件测试面试八股文【附文档】
  • 基于动态增强的 LLM 置信度方法研究
  • 存储引擎 RocksDB
  • 速通python加密之SHA加密
  • MySQL进阶学习与初阶复习第三天