掌握这些,ts类型声明事半功倍 💪🏻

不要做

  • 永远不要使用类型 NumberStringBooleanSymbolObject 这些类型指的是非原始装箱对象,使用 numberstringbooleansymbol 类型
  • 不要使用 any 作为类型,除非正在将 JavaScript 项目迁移到 TypeScript
  • 不要将返回类型 any 用于其值将被忽略的回调,使用返回类型 void,其可以防止意外地以未经检查的方式使用函数的返回值 const fun = (fn: () => void) => {};

declare 作用?

declare关键字在 TypeScript 中主要用于声明类型信息,而不是实际的实现代码。其帮助 TypeScript 理解代码中的类型结构,从而提供更好的类型检查和代码提示等功能。

声明全局变量类型

当在项目中使用了某些全局变量,而这些变量没有明确的类型定义时,可以使用declare来声明它们的类型。

declare const globalVar: string;

如,在 UmiJS 框架 中,针对全局变量声明类型:

// typings.d.ts
declare function log(info: string): void; 
declare global {type AnalysisFunction = (params: { pageId: string; eventId: string; ext?: object }) => void;interface Window: {// 基座挂载window判断权限方法PermissionAuth?: (params: {// 页面唯一标识pk: string;// 按钮唯一标识fk?: string;}) => boolean;}
}

声明模块

如果要使用一个外部模块,但这个模块没有提供 TypeScript 的类型定义文件(.d.ts),可以通过declare module来声明它的类型。

declare module 'my-custom-module' {export function doSomething(): void;
}

.d.ts.ts 区别?

  • .d.ts:第三方库提供类型声明、声明全局变量或全局类型、扩展现有模块的类型声明

    // jquery.d.ts
    declare var jQuery: {(selector: string): any;ajax: {(url: string, settings?: any): void;};
    };
    
  • .ts:定义实际的类型和接口,并且这些类型和接口将被项目中的其他代码使用时,或者在项目内部进行模块化开发时

    // user.ts
    export interface User {id: number;name: string;email: string;
    }
    

import typeimport 区别?

  • import type:用于导入类型信息,但不会将导入的模块包含在运行时代码中。它主要用于类型声明,不会影响最终的 JavaScript 输出

    // main.ts
    import type { User } from './types';
    
  • import:用于导入模块中的值(如变量、函数、类等),这些值在运行时会被加载和执行。它不仅用于类型声明,还用于实际的代码运行

extends 扩展类型

interface 上的 extends 关键字允许从其他命名类型复制成员,并添加任何新成员。

这对于减少类型声明的数量以及表明同一属性的几个不同的意图很有用。

interface Person {name: string;age: number;
}
// 类型扩展
interface Man extends Person {readonly sex: '男';
}interface SpecialSkill {fly: () => void;
}
// 也可以从多种类型扩展
interface Superman extends Man, SpecialSkill {}

typeofkeyof 区别?

  • typeof 操作符用于获取一个变量或属性的类型

  • keyof 操作符用于获取一个对象类型的所有键的联合类型

interface IPerson {name: string;age: number;
}type PersonKey = keyof IPerson; // 类型是 "name" | "age"
const p: PersonKey = 'age';
const pType = typeof p; // string

更多内容,可详见:TypeScript系列:第四篇 - typeof 与 keyof

extends keyof 类型约束

在动态访问和操作对象属性时保持类型安全,避免运行时错误。

<TData, TLabelKey extends keyof TData> 定义两个泛型参数TDataTLabelKey

  • TData表示传入的对象类型
  • TLabelKey表示对象中的某个键,该键必须是TData对象的一个键(通过extends keyof TData约束)
动态访问对象属性

动态地访问对象的某个属性时,可以使用这种约束来确保访问的属性是有效的。

interface TData {city: string;adcode: number;
}// labelKey必须是data对象的键之一
function getValue<TData, TLabelKey extends keyof TData>(data: TData, labelKey: TLabelKey): TData[TLabelKey] {return data[labelKey];
}
动态生成对象属性
interface TData {city: string;adcode: number;
}// labelKey必须是data对象的键之一,value的类型必须与data[labelKey]的类型一致
function setProperty<TData, TLabelKey extends keyof TData>(data: TData, labelKey: TLabelKey, value: TData[TLabelKey]): TData {data[labelKey] = value;return data;
}

!非空断言

在不进行任何显式检查的情况下从类型中删除 nullundefined

function liveDangerously(x?: number) {return x.toFixed(); 	// x可能为“未定义”return x!.toFixed();  // ✔️
}
  • 绕过类型检查:当确定一个变量不会是nullundefined,但 TypeScript 编译器无法确定时,使用 !来绕过类型检查
  • 避免编译错误:在某些情况下,TypeScript会报错,因为其认为一个变量可能是nullundefined。使用!可以避免编译错误

模板字符串类型的排列组合

获得一组规律固定,可由排列组合得到的联合类型

type A = 'a1' | 'a2';
type B = 'b1' | 'b2';type Products = `${A}-${B}`; // "a1-b1" | "a1-b2" | "a2-b1" | "a2-b2"

实用工具类型

interface A {a: number;b: number;c: number;
}
interface B {c: number;d: number;
}
方法作用示例结果
Partial<Type>构造一个将 Type 的所有属性设置为可选的类型Partial<A & B>{a?: number, b?: number, c?: number}
Pick<Type, Keys>Type 中选取一组属性 Keys来构造一个类型Pick<A, 'a'|'c'>{a: number, c: number}
Omit<Type, Keys>Type 中选择所有属性然后删除 Keys来构造一个类型Omit<A, 'a'|'c'>{b: number}
Extract<Type, Union>Type 中提取所有可分配给 Union 的联合成员来构造一个类型Extract<A|B, B>B

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87622.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87622.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87622.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逐步构建高性能http服务器及聊天室服务器

目录 如何拿到浏览器发来的http请求 如何给浏览器发送响应 响应基本原理 给浏览器发送一个网页作为响应 给浏览器发送一个图片作为响应 接下来我们要做什么 完善业务逻辑 浏览器如何访问特定文件 访问根目录下的文件 访问子文件夹下的文件 习惯性目录结构 GET请求带…

水下航行器外形分类详解

在水下航行器的设计领域&#xff0c;外形是影响其性能和功能的关键因素之一。根据不同的设计目的和应用场景&#xff0c;水下航行器的外形可以按照多种方式进行分类。 本文将详细介绍几种常见的分类方式及其对应的外形特点。 按流体动力布局分类 标准回转体 外形标准回转体外…

Ubuntu:Mysql服务器

mariadb与mysql完全兼容&#xff0c;使用时感受不到差别 目录 1 mariadb的安装2 启动mysql3 关闭防火墙4 连接到mysql5 Mysql的配置文件6 Mysql远程访问 1 mariadb的安装 apt install mariadb-server检查安装 ls /etc/init.d2 启动mysql service mysql restart3 关闭防火墙…

使用systemd 监控服务并实现故障自动重启

一、为什么需要自动重启&#xff1f; 在生产环境中&#xff0c;服务可能因内存溢出、资源竞争、外部依赖中断等问题意外崩溃。手动恢复效率低下&#xff0c;而 systemd 的自动重启机制可在秒级内恢复服务&#xff0c;显著提升系统可用性。 ⚙️ 二、systemd 自动重启的核心配置…

在 React 中使用 WebSockets 构建实时聊天应用程序

实时通信已成为现代 Web 应用程序&#xff08;尤其是在聊天应用程序中&#xff09;不可或缺的功能。实时通信提供了一种强大的方法来实现客户端和服务器之间的实时双向通信。在本指南中&#xff0c;我们将逐步讲解如何使用React WebSockets构建实时聊天应用程序。 先决条件 在…

实验五-Flask的简易登录系统

一、实验目的和任务 1.掌握Flask框架的基本使用方法 2.理解Web应用的会话管理机制 3.实现用户认证系统的基本功能 4.学习模板继承和表单处理技术 要求&#xff1a;请将思考题的答案写在实验报告中 二、实验内容 1.基础环境搭建&#xff1a;创建项目目录结构、安装必要依赖包…

WebSocket类明明注入了Bean,为什么报错为null

在 WebSocket 类中注入 Bean 看似可行而注入 Bean 报错为null&#xff0c;通常是由于Spring 的单例管理机制与 WebSocket 多实例创建特性冲突导致的&#xff0c;具体分析如下&#xff1a;原因分析Spring 的单例特性&#xff1a;Spring 默认以单例模式管理 Bean&#xff0c;即一…

Python 爬虫开发指南:从基础到实战

在大数据时代&#xff0c;数据成为了宝贵的资源。Python 爬虫作为高效获取网络数据的工具&#xff0c;受到越来越多开发者的关注。本文将详细介绍 Python 爬虫的相关知识&#xff0c;助你快速入门并掌握爬虫开发的核心要点。 一、Python 爬虫概述 Python 爬虫&#xff0c;即网…

99、git 超时问题

报错&#xff1a; Push failed ssh: connect to host github.com port 22: Connection timed out Could not read from remote repository

CountDownLatch 详细介绍

CountDownLatch 是 Java 中 java.util.concurrent 包提供的一个同步工具类&#xff0c;用于协调多个线程之间的执行顺序。它允许一个或多个线程等待&#xff0c;直到其他线程完成一组操作后继续执行。CountDownLatch 是一种倒计数锁存器&#xff0c;通过设置一个初始计数器值&a…

Hadoop之HDFS

Hadoop之HDFS HDFS的Shell操作 启动Hadoop集群(方便后续测试) [atguigu@hadoop102 ~]$ sbin/start-dfs.sh [atguigu@hadoop102 ~]$ sbin/start-yarn.sh-help:输出这个命令参数 [atguigu@hadoop102 ~]$ hadoop fs -help rm-ls:显示目录信息 [atguigu@hadoop102 ~]$ hadoop …

【1.4 漫画PostgreSQL高级数据库及国产数据库对比】

&#x1f418; 漫画PostgreSQL高级数据库及国产数据库对比 &#x1f468;‍&#x1f4bb; 小明&#xff1a;“老王&#xff0c;除了MySQL&#xff0c;还有哪些优秀的关系型数据库&#xff1f;国产数据库发展得怎么样&#xff1f;” &#x1f9d9;‍♂️ 架构师老王&#xff1a;…

OLT、ONU、ONT、SFU、HGU、ODN,它们是什么?它们之间有什么区别?

我们经常会看到OLT、ONU、ONT、SFU、HGU等设备术语。它们分别是什么?又有什么区别呢? PON组件:OLT、ONU、ONT和ODN 无源光网络(PON)采用光纤和分路器&#xff0c;以点对多点拓扑将数据从单一源分发到多个用户。与有源光网络 (AON)不同&#xff0c;PON 仅在光域中运行&#…

sql USING 简化 JOIN 操作

在 SQL 中&#xff0c;USING 是一种用于简化 JOIN 操作的语法糖&#xff0c;它允许你明确指定连接表时所依据的列名。与传统的 ON 子句相比&#xff0c;USING 提供了更简洁的语法1. 基本语法与作用table1 JOIN table2 USING (column_name);将 table1 和 table2 中 column_name …

android开发中的 AndroidX 版本的查看 及 constraintLayout的简单用法

1、查看库的版本 平常我们经常会用到一些库&#xff0c;但是不知道是什么版本&#xff0c;也不知道最新的是什么版本&#xff0c;当然最好的就是到官网去查看&#xff0c;或者三方的maven库。 2、官方地址 AndroidX 版本 | Jetpack | Android Developers 3、比如我们来…

oracle锁表,oracle解锁表,oracle用户连接数

一、查看被锁的表 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id lo.object_id and lo.session_id sess.sid; 二、解锁表语句 alter …

3D可视化:开启多维洞察新时代

3D可视化技术以一种前所未有的方式&#xff0c;将数据、模型与现实世界紧密相连&#xff0c;为人们带来了沉浸式、交互式的全新体验&#xff0c;彻底革新了信息的呈现与理解方式。一、3D可视化的技术原理从技术本质来看&#xff0c;3D可视化基于一系列复杂而精妙的原理。通过数…

List中的对象进行排序处理

以下是使用 Java Stream 对对象列表按 id 和 age 排序的完整示例&#xff0c;包含升序和降序两种场景&#xff1a; 1. 定义测试对象类 Getter Setter public class Person {private int id;private int age; }2. 排序实现代码 import java.util.*; import java.util.stream.…

秋招Day14 - Redis - 底层结构

Redis都有哪些底层数据结构&#xff1f; 有八种核心的底层数据结构。 SDS Redis自己实现的动态字符串&#xff0c;SDS结构中直接存储了已使用的字符数组长度len和未使用的字符数组长度free&#xff0c;所以获取长度的时间复杂度是O(1)&#xff0c;还支持动态扩容&#xff0c…

使用Mac自带的图像捕捉导出 iPhone 相册

用 数据线 将 iPhone 连接到 Mac必须是数据线,有些充电线插上去后无法识别到iphone在 iPhone 上点击“信任此电脑”在 Mac 上打开应用&#xff1a;快速方式&#xff1a;按 Command Space 打开 Spotlight&#xff0c;输入 图像捕捉 或 Image Capture&#xff0c;回车或者从 /系…