首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TypeScript系列:第四篇 - typeof 与 keyof

TypeScript系列:第四篇 - typeof 与 keyof

作者头像
奋飛
发布2025-05-31 16:11:57
发布2025-05-31 16:11:57
38500
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

TypeScript系列:第三篇 - 泛型 有提及 keyof 的使用。

本文将详细介绍 keyoftypeof 运算符的基本概念、应用场景以及如何结合使用它们来提高代码的类型安全性。

keyof

keyof 运算符用于获取一个类型的所有键名(属性名)。

例如,对于一个接口或类型,keyof 可以提取出所有属性的名字。

代码语言:javascript
代码运行次数:0
运行
复制
interface Person {
    name: string;
    age: number;
}

type PersonKeys = keyof Person; // "name" | "age"
应用场景
类型安全

确保访问的属性在对象上是有效的,避免运行时错误

代码语言:javascript
代码运行次数:0
运行
复制
interface Person {
  name: string;
  age: number;
}
function getPersonProp(person: Person, prop: keyof Person) {
  return person[prop];
}

const p: Person = { name: 'ligang', age: 34 };
getPersonProp(p, 'name');
getPersonProp(p, 'address');	// 类型“"address"”的参数不能赋给类型“keyof Person”的参数
映射类型

在已有类型的基础上创建新类型。

Custom 所有类型改为 boolean,并形成新的 myCustom 类型。

代码语言:javascript
代码运行次数:0
运行
复制
type OptionsFlags<T> = {
  [Property in keyof T]: boolean;
};

interface Custom {
  a: () => void;
  b: () => void;
}

type myCustom = OptionsFlags<Custom>; // { a: boolean; b: boolean;}
条件映射类型

在上述映射类型的基础基础上,可以根据属性类型进行动态类型转换。

Custom 所有 string类型改为 boolean(其他类型保留),并形成新的 myCustom 类型。

代码语言:javascript
代码运行次数:0
运行
复制
type OptionsFlags<T> = {
  [Property in keyof T]: T[Property] extends String ? boolean : T[Property];
};

interface Custom {
  a: () => void;
  b: string;
  c: number;
}

type myCustom = OptionsFlags<Custom>; // { a: () => void; b: boolean; c: number}

keyof 具有特别强的灵活性。其可以针对获取的键名,做个性化改造!

Custom 所有类型改为可选,并形成新的 myCustom 类型。

代码语言:javascript
代码运行次数:0
运行
复制
type Partial<T> = {
  [P in keyof T]?: T[P];
};

interface Custom {
  foo: number;
}
type myCustom = Partial<Custom>;  //  { foo?: number }

typeof

typeof 运算符用于获取一个变量的类型。

这在 TypeScript 中非常有用,可以动态地从变量中提取类型信息。

代码语言:javascript
代码运行次数:0
运行
复制
const person = {
    name: 'ligang',
    age: 34
};

type PersonType = typeof person; // { name: string; age: number; }
应用场景
类型推导

从变量中推导出类型,用于类型声明。

代码语言:javascript
代码运行次数:0
运行
复制
let h = 'hello';
let w: typeof h = 'world'; // let w: string
类型安全

在函数中使用 typeof 来限制参数类型。

代码语言:javascript
代码运行次数:0
运行
复制
const person = { name: 'ligang', age: 34 };
function greet(name: typeof person.name) { // name: string
  console.log(`Hello, ${name}!`);
}
类型守卫

此类型守卫函数中,isNumber 检查 x 是否为 number 类型。

代码语言:javascript
代码运行次数:0
运行
复制
function isNumber(x: number | string): x is number {
  return typeof x === "number";
}

结合使用

获取一个对象所有键的联合类型

在实际开发中,经常需要结合使用 keyoftypeof 来实现更复杂的类型操作。

代码语言:javascript
代码运行次数:0
运行
复制
const person = { name: 'ligang', age: '34' };

type Person = keyof typeof person; // "name" | "age"

1️⃣ typeof person

代码语言:javascript
代码运行次数:0
运行
复制
typeof person  // { name: string; age: string; }

从变量 person 中提取类型信息;返回的是 person 的类型,而不是 person 本身。

2️⃣ keyof

代码语言:javascript
代码运行次数:0
运行
复制
keyof { name: string; age: string; } // "name" | "age"

⚠️ 注意:keyof person 会导致编译错误。这里 person 是具体的对象,不是类型。

获取一个枚举所有键的联合类型
代码语言:javascript
代码运行次数:0
运行
复制
enum Color {
  Red,
  Green,
  Blue,
}
type ColorKeys = keyof typeof Color; // "Red" | "Green" | "Blue"
const color: ColorKeys = 'Red';

typeof Color 会获取到 Color 枚举的类型,它包含了枚举的所有成员。

使用 keyof 操作符,可以得到一个由这些成员名组成的联合类型。

🌴🌴🌴 typeof 针对的是变量;keyof 面向的是类型。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • keyof
    • 应用场景
      • 类型安全
      • 映射类型
      • 条件映射类型
  • typeof
    • 应用场景
      • 类型推导
      • 类型安全
      • 类型守卫
  • 结合使用
    • 获取一个对象所有键的联合类型
    • 获取一个枚举所有键的联合类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档