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

TypeScript系列:第四篇 - typeof 与 keyof

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

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

类型操作符
typeof
keyof
获取变量或属性的类型
获取类型的键的联合

keyof

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

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

interface Person {name: string;age: number;
}type PersonKeys = keyof Person; // "name" | "age"

应用场景

类型安全

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

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 类型。

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 类型。

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 类型。

type Partial<T> = {[P in keyof T]?: T[P];
};interface Custom {foo: number;
}
type myCustom = Partial<Custom>;  //  { foo?: number }

typeof

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

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

const person = {name: 'ligang',age: 34
};type PersonType = typeof person; // { name: string; age: number; }

应用场景

类型推导

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

let h = 'hello';
let w: typeof h = 'world'; // let w: string
类型安全

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

const person = { name: 'ligang', age: 34 };
function greet(name: typeof person.name) { // name: stringconsole.log(`Hello, ${name}!`);
}
类型守卫

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

function isNumber(x: number | string): x is number {return typeof x === "number";
}

结合使用

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

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

const person = { name: 'ligang', age: '34' };type Person = keyof typeof person; // "name" | "age"

1️⃣ typeof person

typeof person  // { name: string; age: string; }

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

2️⃣ keyof

keyof { name: string; age: string; } // "name" | "age"

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

获取一个枚举所有键的联合类型

enum Color {Red,Green,Blue,
}
type ColorKeys = keyof typeof Color; // "Red" | "Green" | "Blue"
const color: ColorKeys = 'Red';

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

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


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

相关文章:

TypeScript系列:第四篇 - typeof 与 keyof

在 TypeScript系列&#xff1a;第三篇 - 泛型 有提及 keyof 的使用。 本文将详细介绍 keyof 和 typeof 运算符的基本概念、应用场景以及如何结合使用它们来提高代码的类型安全性。 #mermaid-svg-bnMG6PMTxMI4iafc {font-family:"trebuchet ms",verdana,arial,sans-se…...

JDK8新增特性(值得收藏)

1.Lamdba表达式 就相当于要使用接口Lock就不需要再创建一个类去实现接口了&#xff0c;直接用Lambda表达式省略了在创建的那个类。 Lamdba表达式是什么&#xff1f; “->”,Lambda操作符或箭 头操作符&#xff0c;它将Lambda表达式分割为两部分。 左边&#xff1a;指Lam…...

MATLAB系列06:复数数据、字符数据和附加画图类

MATLAB系列06&#xff1a;复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量&#xff08; complex variables&#xff09;6.1.2 带有关系运算符的复数的应用6.1.3 复函数&#xff08; complex function&#xff09;6.1.4 复数数据的作…...

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…...

CSAPP Attack Lab

个人感觉非常有意思的一个 Lab&#xff0c;涉及的知识面比较窄&#xff0c;主要关注 缓冲区溢出漏洞 这一个方面&#xff0c;并基于此进行代码攻击&#xff0c;体验一把做黑客的感觉&#xff0c;对应知识点为书中的 3.10 节内容。 这个 Lab 上手便给了我当头一棒&#xff0c;在…...

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI&#xff1a;网络功能虚拟化基础设施层 NFVI&#xff08;Network Functions Virtualization Infrastructure&#xff09;即网络功能虚拟化基础设施层&#xff0c;是NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;架构中的一个重要…...

不在同一局域网怎么远程桌面?非局域网环境下,实现远程桌面访问的5个方法分享!

非局域网环境下&#xff0c;怎么远程桌面&#xff1f;还能做到吗&#xff1f; 在企业管理中&#xff0c;远程桌面访问已成为提高工作效率、实现跨地域协同工作的关键工具。 然而&#xff0c;当被控端与控制端不在同一局域网时&#xff0c;如何实现远程桌面连接成为了许多企业…...

SparkSQL-初识

一、概览 Spark SQL and DataFrames - Spark 3.5.2 Documentation 我们先看下官网的描述&#xff1a; SparkSQL是用于结构化数据处理的Spark模块&#xff0c;与基本的Spark RDD API不同。Spark SQL提供的接口为Spark提供了更多关于正在执行的数据和计算结构的信息。在内部&a…...

Go语言的垃圾回收(GC)机制的迭代和优化历史

Go语言的垃圾回收&#xff08;GC&#xff09;机制自Go语言发布以来经历了多次重要的迭代和优化&#xff0c;以提高性能和减少程序运行时的停顿时间。 以下是一些关键的版本和相应的GC优化&#xff1a; Go版本GC耗时情况主要改进点Go 1.0-1.4可能达到几百毫秒至秒级使用简单的标…...

thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)

thinkphp8 从入门到放弃 引言 thinkphp* 大道至简一、 thinkphp8 安装安装Composerthinkphp 安装命令(tp-项目名称)多应用安装&#xff08;一个项目不会只有一个应用&#xff09;安装完文件目录如下本地部署配置伪静态好了项目可以run 二、架构服务&#xff08;Service&#xf…...

对于电商跨境电商独立站中源代码建站和SaaS建站的区别

电商跨境电商独立站的搭建有多种方式&#xff0c;作为电商企业&#xff0c;搭建完全自主控制的电商独立站&#xff0c;对于电商企业的发展和运营有着至关重要的作用。下面推荐一个使用多年的跨境电商独立站系统源码&#xff0c;做简要介绍&#xff0c;据说前段时间火爆的Pandab…...

使用vite+react+ts+Ant Design开发后台管理项目(二)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…...

C++之 string(中)

C之 string string类对象的容量操作 resize 将有效字符的个数该成n个&#xff0c;多出的空间用字符c填充 虽然在string里用的不多&#xff0c;但是在vector里面常见 这里有三种情况&#xff1a; 1&#xff09;resize小于当前的size 2)resize大于当前的size,小于capacity …...

双向链表的基本结构及功能实现

1.基本结构: 双向链表是一种链表数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含三个部分&#xff1a; (1).数据域&#xff1a;存储节点的数据 (2).前驱指针:指向前一个节点 (3).后驱指针:指向下一个节点 2.基本特性&#xff1a; 双向链接: 与单向链表…...

stm32定时触发软件中断

这里使用定时器作为延时&#xff0c;单位为秒&#xff0c;使用exti的软件触发方式&#xff0c;配置见代码&#xff0c;在main里进行触发软件中断 代码 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "misc.h" #include "…...

blender设置背景图怎么添加?blender云渲染选择

Blender是一款功能强大的3D建模软件&#xff0c;它以流畅的操作体验和直观的用户界面而闻名。使用Blender&#xff0c;你可以轻松地为你的3D模型添加背景图片。 以下是具体的操作步骤&#xff1a; 1、启动Blender&#xff1a;首先&#xff0c;打开Blender软件。访问添加菜单&a…...

MMD模型及动作一键完美导入UE5-Blender方案(三)

1、下载并安装blender_mmd_tools插件 1、下载并安装Blender,Blender,下载Blender3.6,下载太新的版本可能会跟blender_mmd_tools不匹配 2、github下载blender_mmd_tools:https://github.com/UuuNyaa/blender_mmd_tools/ 3、Edit->Preference->Add ons->Install F…...

网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业

很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习&#xff0c;最终也只是会无疾而终&#xff01;黑客是一个大的概念&#xff0c;里面包含了许多方向&#xff0c;不同的方向需要学习的内容也不一样。 算上从学校开始学习&#xff0c;已经在网安这条路上走…...

如何在O2OA中使用ElementUI组件进行审批流程工作表单设计

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计&#xff0c;O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置&#xff0c;不需要过多的代码编写&#xff0c;业务人员可以直接进行修改操作。 在流程表单设计界面&#xff0c;可以在左边的工具栏找到Ele…...

三、LLM应用开发准备工作

LLM应用开发准备工作 开发基础开发工具大模型kxswkey的配置与使用工具推荐结语 开发基础 最好具备一定的Python开发基础&#xff0c;不需要特别深 如果不具备&#xff0c;可以先学习一下基础知识&#xff08;概念&#xff09;&#xff0c;比如Python环境管理、包管理与使用、基…...

ONNXRuntime GPU推理想用BFloat16加速?手把手教你搞定PyTorch + CUDA环境配置与避坑

ONNXRuntime GPU推理想用BFloat16加速&#xff1f;手把手教你搞定PyTorch CUDA环境配置与避坑 在深度学习模型部署领域&#xff0c;BFloat16数据类型正逐渐成为提升推理性能的新宠。这种16位浮点格式保留了与32位浮点相同的指数位&#xff0c;在保持数值范围的同时减少了内存占…...

打破平台壁垒:Windows上安装APK文件的完整解决方案

打破平台壁垒&#xff1a;Windows上安装APK文件的完整解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行安卓应用&#xff…...

终极指南:在Windows上直接安装安卓APK文件的5个简单步骤

终极指南&#xff1a;在Windows上直接安装安卓APK文件的5个简单步骤 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上运行安卓应用&#xff0c;但又厌…...

终极CoreCycler教程:简单三步完成CPU稳定性测试与优化

终极CoreCycler教程&#xff1a;简单三步完成CPU稳定性测试与优化 【免费下载链接】corecycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitcode.com/…...

Java 大厂面试 200 题完整版含答案解析

前言本文整理了近两年从阿里、腾讯、字节、美团、京东、拼多多等大厂面试中高频出现的 200 道 Java 面试题&#xff0c;覆盖 Java 基础、集合、并发、JVM、Spring、MySQL、Redis、消息队列、分布式、场景设计 等核心模块&#xff0c;每题都附有简明扼要的答案解析&#xff0c;助…...

防火门安装与验收要点|闭门器、密封条、顺序器缺一不可

防火门安装与验收要点一、必备配件&#xff08;缺一不可&#xff09;闭门器&#xff1a;自动关门&#xff0c;火灾常态闭合防火密封条&#xff1a;遇火膨胀&#xff0c;隔烟阻火顺序器&#xff1a;双扇门专用&#xff0c;保证先后闭合二、安装要点门框墙体嵌实牢固&#xff0c;…...

如何快速解密网易云NCM文件:终极免费转换工具指南

如何快速解密网易云NCM文件&#xff1a;终极免费转换工具指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否在网易云音乐下载了喜欢的歌曲&#xff0c…...

JetBrains IDE试用期重置终极指南:简单三步实现30天无限续杯

JetBrains IDE试用期重置终极指南&#xff1a;简单三步实现30天无限续杯 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾经在项目开发的关键时刻&#xff0c;突然看到JetBrains IDE弹出"评估期已结束…...

Kubernetes自动化更新利器Keel:实现容器镜像的持续部署

1. 项目概述&#xff1a;为什么我们需要一个“自动化的应用更新管家”&#xff1f; 如果你和我一样&#xff0c;负责维护着几个、十几个&#xff0c;甚至几十个运行在Kubernetes或Docker环境中的应用&#xff0c;那你一定对“更新”这件事又爱又恨。爱的是&#xff0c;新版本意…...

数据流编排与异步任务调度中间件kelivo部署与实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的项目&#xff0c;叫“Chevey339/kelivo”。乍一看这个标题&#xff0c;可能有点摸不着头脑&#xff0c;它不像那些直接告诉你“XX管理系统”或“XX工具库”的项目名那么直白。但恰恰是这种看似神秘的命名&#xff0c;背后往往隐藏…...