ts类型体操-简单篇

server/2024/10/9 10:47:38/

介绍下type challenge中几道简单的类型体操。涉及的知识点主要是:映射类型、 条件类型、联合类型的分布式、infer R等。

1、实现pick

不使用 Pick<T, K> ,实现 TS 内置的 Pick<T, K> 的功能。

从类型 T 中选出符合 K 的属性,构造一个新的类型

interface Todo {title: stringdescription: stringcompleted: boolean
}type TodoPreview = MyPick<Todo, 'title' | 'completed'>const todo: TodoPreview = {title: 'Clean room',completed: false,
}type MyPick<T, K extends keyof T> = {[key in K]: T[key]
}

2、实现Readonly对象属性只读

不要使用内置的Readonly<T>,自己实现一个。

泛型 Readonly<T> 会接收一个 泛型参数,并返回一个完全一样的类型,只是所有属性都会是只读 (readonly) 的。

也就是不可以再对该对象的属性赋值。

interface Todo {title: stringdescription: string
}const todo: MyReadonly<Todo> = {title: "Hey",description: "foobar"
}todo.title = "Hello" // Error: cannot reassign a readonly property
todo.description = "barFoo" // Error: cannot reassign a readonly propertytype MyReadonly<T> = {readonly [key in keyof T]: T[key]
}

3、实现Exclude

实现内置的 Exclude<T, U> 类型,但不能直接使用它本身。

从联合类型 T 中排除 U 中的类型,来构造一个新的类型。

type Result = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'
type MyExclude<T, M> = T extends M ? never : T

4、元组转为对象

将一个元组类型转换为对象类型,这个对象类型的键/值和元组中的元素对应。

const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as consttype result = TupleToObject<typeof tuple> // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}type TupleToObject<T extends readonly PropertyKey[]> = {[key in T[number]]: key
}

5、实现Parameters

实现内置的 Parameters 类型,而不是直接使用它,可参考TypeScript官方文档。

const foo = (arg1: string, arg2: number): void => {}type FunctionParamsType = MyParameters<typeof foo> // [arg1: string, arg2: number]//获取函数的参数
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer R) => any ? R : never


http://www.ppmy.cn/server/129227.html

相关文章

单片机原理与技术

文章目录 一、单片机概述二、单片机的基本原理1. **硬件结构**2. **指令系统** 三、单片机的关键技术1. **编程技术**2. **接口技术**3. **嵌入式系统技术** 四、单片机在现代科技中的应用 一、单片机概述 单片机&#xff0c;全称为单片微型计算机&#xff08;Single-Chip Mic…

【吊打面试官系列-MySQL面试题】说说对 SQL 语句优化有哪些方法?

大家好&#xff0c;我是锋哥。今天分享关于【说说对 SQL 语句优化有哪些方法&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 说说对 SQL 语句优化有哪些方法&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1、Where 子句中&#xff1a;…

使用 Maven 与 Spring Boot 集成的详细指南

一、Maven 简介 Maven 是一个基于 POM&#xff08;Project Object Model&#xff09;的项目管理工具&#xff0c;它提供了以下功能&#xff1a; 依赖管理&#xff1a;Maven 可以轻松地管理项目所需的第三方库&#xff0c;并能自动解决库之间的依赖关系。构建自动化&#xff1…

基于STM32设计的智能学习台灯(华为云IOT)(238)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…

MySQL 修改数据的语句

在 MySQL 中&#xff0c;修改数据的语句主要使用 UPDATE 语句。UPDATE 语句允许你更新表中已存在的记录。以下是一个基本的 UPDATE 语句的语法和示例&#xff1a; 语法 UPDATE 表名 SET 列1 值1, 列2 值2, ... WHERE 条件;示例 假设有一个名为 employees 的表&#xff0c;…

【AI知识点】词嵌入(Word Embedding)

词嵌入&#xff08;Word Embedding&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一种技术&#xff0c;用于将词语或短语映射为具有固定维度的实数向量。这些向量&#xff08;嵌入向量&#xff09;能够捕捉词语之间的语义相似性&#xff0c;即将语义相近的词映射到…

论文速读:基于概率教师学习的域自适应目标检测

原文标题&#xff1a;Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题&#xff1a;基于概率教师学习的域自适应目标检测 代码地址&#xff1a; GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…

【VUE】会员管理(增删改查)

前端 router/index.js import { createRouter, createWebHistory } from vue-router import {userInfoStore} from "/stores/user.js";const router createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: /login,name: login,comp…