在ts 中 对于常见的内置工具类型、类型操作符和关键字简单解释

背景

最近面试的时候,经常看到有同学说自己熟练使用ts 结果一问 Pick Omit Partial Required keyof typeof Record等都说的不太清楚,仅仅是对于 type interface有些了解,下面简单的说下这些的基础用法,用于扫盲。

keyof 操作符

keyof 用于获取类型 的所有公共属性名,返回一个由这些属性名组成的联合类型

核心作用

  • 将类型的属性名转换为联合类型。
  • 常用于泛型约束,确保参数是对象的有效属性名。
js 复制代码
// 类型定义
type User = {
  name: string;
  age: number;
  email: string;
};

// 使用 keyof 获取属性名联合类型
type UserKeys = keyof User; // 等价于: "name" | "age" | "email"


// 泛型约束示例
function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

const user: User = { name: "Alice", age: 30, email: "alice@example.com" };
const name: string = getProperty(user, "name"); // ✅ 正确
// const invalid = getProperty(user, "invalidKey"); // ❌ 错误:"invalidKey" 不在 "name" | "age" | "email" 中

typeof 操作符

在 TypeScript 中,typeof 用于获取 的类型(注意与 JavaScript 中的typeof区分,后者返回值的运行时类型字符串)。

核心作用

  • 将值转换为对应的类型。
  • 常用于获取变量、对象、函数或类的类型。
js 复制代码
// 对象字面量
const config = {
  apiUrl: "https://api.example.com",
  timeout: 5000,
  retry: true
};

// 使用 typeof 获取 config 的类型
type ConfigType = typeof config;
// 等价于:
// type ConfigType = {
//   apiUrl: string;
//   timeout: number;
//   retry: boolean;
// };

keyof typeof 组合使用

eyof typeof 结合了两者的功能:先用 typeof 获取值的类型,再用 keyof 获取该类型的属性名联合类型。

核心作用

  • 中提取属性名的联合类型,避免重复定义类型。
  • 常用于静态对象、枚举、类的静态属性等场景。
js 复制代码
const settings = {
  theme: "dark",
  fontSize: 16,
  isPremium: true
};

// 获取 settings 对象的属性名联合类型
type SettingKeys = keyof typeof settings; // "theme" | "fontSize" | "isPremium"

// 类型安全的属性访问函数
function getSetting(key: SettingKeys) {
  return settings[key];
}

const theme = getSetting("theme"); // ✅ 正确
// const invalid = getSetting("language"); // ❌ 错误:"language" 不在 SettingKeys 中

其他关键字的大致解释

Pick<T, K>

作用 :从类型 T 中选取指定的属性 K,组成新类型。

js 复制代码
type User = { name: string; age: number; email: string };
type NameAndEmail = Pick<User, "name" | "email">; // { name: string; email: string }

Omit<T, K>

作用 :从类型 T 中排除指定的属性 K,返回剩余属性组成的新类型。

js 复制代码
type User = { name: string; age: number; email: string };
type WithoutEmail = Omit<User, "email">; // { name: string; age: number }

Partial<T>

作用 :将类型 T 的所有属性变为可选(?)。

js 复制代码
type User = { name: string; age: number };
type PartialUser = Partial<User>; // { name?: string; age?: number }

Required<T>

作用 :将类型 T 的所有可选属性变为必需(移除 ?

js 复制代码
type User = { name?: string; age?: number };
type RequiredUser = Required<User>; // { name: string; age: number }

Record<K, T>

作用 :创建一个对象类型,其键为 K,值为 T

js 复制代码
type UserRoles = Record<string, boolean>; // { [key: string]: boolean }

常见误区与注意事项

keyofkeyof typeof 的区别

keyof SomeType:直接从类型中提取属性名。

keyof typeof someValue:先获取值的类型,再提取属性名。

相关推荐
IT_陈寒16 分钟前
Java并发编程避坑指南:7个常见陷阱与性能提升30%的解决方案
前端·人工智能·后端
HBR666_30 分钟前
AI编辑器(FIM补全,AI扩写)简介
前端·ai·编辑器·fim·tiptap
excel35 分钟前
一文读懂 Vue 组件间通信机制(含 Vue2 / Vue3 区别)
前端·javascript·vue.js
JarvanMo39 分钟前
Flutter 应用生命周期:使用 AppLifecycleListener 阻止应用崩溃
前端
我的xiaodoujiao2 小时前
从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 9--基础知识 5--常用函数 3
前端·python·测试工具·ui
李鸿耀4 小时前
Flex 布局下文字省略不生效?原因其实很简单
前端
皮蛋瘦肉粥_1215 小时前
pink老师html5+css3day06
前端·css3·html5
华仔啊9 小时前
前端必看!12个JS神级简写技巧,代码效率直接飙升80%,告别加班!
前端·javascript
excel9 小时前
dep.ts 逐行解读
前端·javascript·vue.js
爱上妖精的尾巴9 小时前
5-20 WPS JS宏 every与some数组的[与或]迭代(数组的逻辑判断)
开发语言·前端·javascript·wps·js宏·jsa