19. TypeScript 类型运算符

TypeScript作为JavaScript的超集,不仅提供了静态类型检查,还引入了多种类型运算符,使得类型定义更加灵活和强大。这些运算符可以帮助我们构建更加精确和灵活的类型定义。本文将详细介绍这些类型运算符的用法和应用场景。

keyof 运算符

keyof 运算符用于获取对象类型的所有键的联合类型。

使用场景 : 当你需要引用对象的键作为类型时,keyof非常有用。

typescript 复制代码
interface User {
  id: number;
  name: string;
}

type UserKeys = keyof User; // 'id' | 'name'

// 使用keyof类型保护函数参数只能是特定的键
function getValue(user: User, key: UserKeys) {
  return user[key];
}

typeof 运算符

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

使用场景 : 当你需要引用一个变量的类型作为另一个变量的类型时,typeof可以派上用场。

typescript 复制代码
let foo = "Hello, TypeScript!";
type FooType = typeof foo; // string

// 使用typeof创建与变量foo相同类型的新变量
let bar: FooType = "Hi, Copilot!";

in 运算符

在TypeScript中,in运算符用于迭代联合类型,通常与映射类型一起使用。

使用场景 : 当你需要根据联合类型的值动态生成类型时,in运算符非常有用。

typescript 复制代码
type Properties = "propA" | "propB";
type Obj = {
  [P in Properties]: P extends "propA" ? string : number;
};
// Obj类型为 { propA: string; propB: number; }

extends 关键字

extends关键字用于条件类型,表示如果一个类型可以赋值给另一个类型,则结果是一个类型,否则是另一个类型。

使用场景 : extends用于创建基于条件的类型,类似于JavaScript中的三元运算符。

typescript 复制代码
type NonNullable<T> = T extends null | undefined ? never : T;

// 使用extends移除null和undefined类型
type StringOrNull = string | null;
type JustString = NonNullable<StringOrNull>; // string

infer 关键字

infer关键字用于在条件类型中推断类型变量。

使用场景 : infer常用于在函数类型中推断返回类型。

typescript 复制代码
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

// 使用infer推断函数返回类型
type ExampleType = ReturnType<() => string>; // string

方括号

方括号用于访问类型中特定属性的类型。

使用场景: 当你需要引用对象中某个属性的类型时,方括号语法很有帮助。

typescript 复制代码
type Person = { name: string; age: number; };
type NameType = Person["name"]; // string

// 使用方括号访问类型属性
let personName: NameType = "Alice";

is 运算符

is运算符用于类型守卫,它告诉TypeScript编译器一个值是特定的类型。

使用场景 : is运算符用于在运行时检查类型,并在编译时提供类型信息。

typescript 复制代码
function isString(test: any): test is string {
  return typeof test === "string";
}

// 使用is运算符进行类型守卫
if (isString(foo)) {
  console.log(foo.toUpperCase()); // 现在foo被识别为string类型
}

satisfies 运算符

satisfies运算符用于在表达式级别上强制类型兼容性。

使用场景 : 当你想要确保一个对象满足某个类型,但不想进行类型断言时,satisfies可以使用。

typescript 复制代码
let obj = { id: 1, name: "Copilot" } satisfies User;

// 使用satisfies确保obj符合User接口

TypeScript的类型运算符极大地丰富了类型系统的表达能力,使得我们可以编写出更加安全、可维护的代码。通过本文的介绍和示例,希望大家能够更好地理解和运用这些类型运算符,提升自己的TypeScript编程技能。

相关推荐
2501_920931706 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得07 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5168 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino8 小时前
图片、文件的预览
前端·javascript
2501_920931709 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman052810 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔10 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李10 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN10 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒10 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局