您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

掌握以下TypeScript方法,让你开发更加得心应手

时间:2022-08-15 14:25:22  来源:  作者:三木前端笔记

本篇文章汇总了,一些typescript的基础概念和一些常用的类型工具方法。

 

常见的typescript类型定义

const num: number = 123 // 数值const str: string = 'string' // 字符串const boo: boolean = true // 布尔const un: undefined = undefined // undefinedconst nu: null = null // nullconst obj: object = {a: 1} // 对象const big: bigInt = 100n; // 大数const sym: symbol = Symbol('s') // symbolconst arr: number[] = [1,2,3] // 数组const arr: Array<number> = [1,2,3] // 数组

元组

在一个数组中,定义不同类型的值。

// 定义数组的第一个值是number类型,第二个是string类型const x: [number, string] = [123, 'hello workd']// 解构const [a,b] = xconsole.log(a,b) // 123, hello world

unknown

不可预先定义的类型,和any很相似,但是unknow比any更加安全。

any是任意类型的父类型,同时也是任意类型的子类型。

unknown是任意类型的父类型,仅此而已。

很多场景下,我们不好定义类型,需要根据实际情况做判断来决定类型,此时如果用any就失去了校验的能力,用unknown有any的效果,又保留了校验的能力。

const str1: unknown = '123'const str2: any = '123'let sex: booleansex = str1 // 报错,因为str类型没有确定,是unknown类型,所以不能赋值给boolean类型sex = str2 // 正常,因为any可以赋值给任意类型

枚举

可以给数值赋予名字,当我们使用的时候,就可以使用名字而不需要记数字,增加了代码的可读性。

// 定义一组角色,每个角色都用一个数字代表enum Roles {  ADMIN = 0,  USER = 1,  MANAGER = 2}

类型继承

接口可以继承,提高了接口的可复用性

interface Animal {  type: string;}interface Dog extends Animal{  name: sting;  age: number;}interface TAIDi extends Dog {  color: string;}

交叉类型

通过&,将多个类型聚合

很多时候,我们不会将类型写在一个type下面,而且拆分成很多个type,通过将这些不同的type聚合组合成一个新的type。想过与interface的extends很相似

type T1 = {name: string}type T2 = {age: number}type T3 = T1 & T2 // {name: string;age: number}

联合类型

通过|,使一个类型支持多个类型,听起来比较绕,我们直接看例子。

// value 支持string和number类型type value = string | number;// value 支持number和null类型type value = number | null// score只能支持1,2,3,4这四个数值type score = 1 | 2 | 3 | 4

对于联合类型,可以让某个变量的值可以支持多种类型,通过这种方式可以避免写any的情况。

交叉类型,简单理解就是合并两个对象类型,很像Object.assign。一个是对于类型,一个是对于对象。

断言

我们希望写的代码定义的某个变量是什么类型,之后使用就是什么类型。

可以是在多人协作中,以及组件参数的传递中,还有接口后来返回值的类型和一开始定义的不一样。

这个时候就可以使用断言,强制定义某个变量是什么类型。

可以理解成虽然某个变量定义的string类型,但是我知道在某个逻辑下会变成number类型,然后告诉编译器当作number类型吧,我拍胸脯保证不会错的。

// 例子1,常见就是从JAVAScript迁移代码到TypeScriptconst foo = {}foo.bar = 123 // Property 'bar' does not exist on type '{}'.(2339)interface Foo {  bar: number}const foo = {} as Foofoo.bar = 123 // 正常赋值// 例子2const nums: number[] = [1,2,3,4,5,6] // 定义number数组// getNum类型是number | undefinedconst getNum = nums.find(item => item > 2) // 获取大于2的第一个元素// Type 'undefined' is not assignable to type 'number'.(2322)const num : number = getNum // 我们知道这段代码的getNum肯定能获取到值,所以修改如下可以正常const num: number = getNum as number

函数

// 基本使用function sum(x: number, y: number) : number {  return x + y}// 可选参数,通过 ? 实现function sum(x: number, y: number,z?: number) : number {  if(z) {    return x + y + z  } else {    return x + y  }}// 参数默认值function sum(x: number, y: number = 0) : number {  return x + y}// 重载// TypeScript的函数重载通过为一个函数指定多个函数类型定义,从而对函数调用的返回值进行检查function sum(a: number,b:number):numberfunction sum(a: string,b:string): stringfunction sum(a: string | number,b: number | string) : string | number {  if(typeof a === 'number' && typeof b === 'number') { // 如果是数值就相加    return a + b  } else { // 否则字符串通过逗号拼接    return a + ',' + b  }}// 大家可以试一下,如果不用重载的话,返回的类型就是string | number// 之后在使用ans1和ans2就还得需要断言const ans1 = sum(1,2) // ans返回的number类型const ans2 = sum('1','2') //  ans返回的string类型

常用的内置方法使用

掌握以下方法让我们写TypeScript事半功倍,通过一些类型转换就可以得到自己想要的类型,而不需要重新定义。

PIck<T,K>

从T集合里面获取K的子级

type Type = {  id : number;  age: number;  name: string;}// SubType的类型是{id:number; name: string;}type SubType = Pick<Type, 'id' | 'name'>; 

keyof

获取一个类型的所有键值

type Person = {  name:string;  age:number}type Key = keyof person // 'age' | 'age'

Partial<T>

将所有属性变为可选。

我们定义某个对象的类型的时候,一开始大部分都会定义成必传的。之后,在另一个地方使用需要将其变成可选,这是便可以使用Partial定义一个新类型,而不改变之前的类型。

interface Todo {  title: string;  description: string;}//  TodoPartial = {name?:string;age?:number}type TodoPartial = Partial<Todo> // description已经成为可选键值,所以不写也可以const todo: TodoPartial = {title: 'sanmu'}

Required

和Partial相反,将可选全部变为必填

interface Props {  a?: number;  b?: string;} const obj: Props = { a: 5 };// Property 'b' is missing in type '{ a: number; }' // but required in type 'Required<Props>'.// b没有传,报错const obj2: Required<Props> = { a: 5 };

Readonly<T>

将所有的键值对设置为只读

interface Todo {  title: string;}const todo: Readonly<Todo> = {  title: "Delete inactive users",};// Cannot assign to 'title' because it is a read-only property.// 因为title是只读,所以报错todo.title = "Hello";

Exclude<T,K>

从T集合中,剔除T类型和U类型的交集,返回剩余部分

type T = Exclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'

Omit<T,K>

从T集合中,过滤掉K的键值对

interface Todo {  title: string;  description: string;  completed: boolean;  createdAt: number;}type TodoInfo = Omit<Todo, "completed" | "createdAt">;// TodoInfo 只有title和descriptionconst todoInfo: TodoInfo = {  title: "Pick up kids",  description: "Kindergarten closes at 5pm",};

Record<T,K>

构造一个对象类型,T表示对象的属性值,K标识对象的属性值

interface CatInfo {  age: number;  breed: string;}type CatName = "miffy" | "boris" | "mordred";// cats的keys是 "miffy" | "boris" | "mordred",value是{ age,breed}const cats: Record<CatName, CatInfo> = {  miffy: { age: 10, breed: "Persian" },  boris: { age: 5, breed: "Maine Coon" },  mordred: { age: 16, breed: "British Shorthair" },};

NonNullable

去除null和undefined。

开发中经常其他人定义了某个类型是包含null或者undefined,可是某些场景并不需要空值,这个时候不想重新写一个新类型,便可以使用这个

type T0 = NonNullable<string | number | undefined>;// T0 = string | numbertype T1 = NonNullable<string[] | null | undefined>;// T1 = string[]

Parameters<T>

获取函数的参数。

比如函数1的第一个参数的类型和函数2的第一个参数的类型是一样的,可以通过这个方法获取函数2的参数赋予给函数1的参数。

// T0 = [] 函数参数是空值type T0 = Parameters<() => string>;// T1 = [s: string]type T1 = Parameters<(s: string) => void>;declare function f3(arg: { a: number; b: string }): void;// T3 = [arg: {a: number;b: string;}]type T3 = Parameters<typeof f3>;                      // 将f4的第一个参数赋予f5函数的第1个参数declare function f4 (a: number, b: string ): void;// T4 = [a: number, b: string]type T4 = Parameters<typeof f4> // a: numberdeclare function f5(a: T4[0],b:string): void

ReturnType

Parameters获取的函数的参数类型,ReturnType则是获取函数的返回值的类型

// T0 = stringtype T0 = ReturnType<() => string>; // T1 = voidtype T1 = ReturnType<(s: string) => void>;// T2 = unknowntype T2 = ReturnType<<T>() => T>;declare function f1(): { a: number; b: string };//  T4 = { a: number; b: string;}type T4 = ReturnType<typeof f1>;


Tags:TypeScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章搞懂TypeScript
TypeScript 是 JavaScript 的超集,一方面给动态类型的 js 增加了类型校验,另一方面扩展了 js 的各种功能。原始数据类型 字符串 数值 布尔 null undefined Symbol BigIntlet s...【详细内容】
2024-01-08  Search: TypeScript  点击:(80)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  Search: TypeScript  点击:(136)  评论:(0)  加入收藏
为什么要在项目中使用TypeScript?
译者 | 李睿随着越来越多的开发人员采用TypeScript,人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力,但在过去十年,它迅速成为一种广...【详细内容】
2023-11-30  Search: TypeScript  点击:(166)  评论:(0)  加入收藏
一文读懂 TypeScript 泛型及应用
泛型是静态类型语言的基本特征,允许将类型作为参数传递给另一个类型、函数、或者其他结构。TypeScript 支持泛型作为将类型安全引入组件的一种方式。这些组件接受参数和返回...【详细内容】
2023-11-20  Search: TypeScript  点击:(196)  评论:(0)  加入收藏
TypeScript 5.3 来了,一大波新特性
根据 TypeScript 路线图,TypeScript 5.3 计划于 11 月 14 日发布。下面是该版本带来的新特性: 导入属性 导入类型中稳定支持 resolution-mode 所有模块模式均支持 resolution-...【详细内容】
2023-11-16  Search: TypeScript  点击:(162)  评论:(0)  加入收藏
万字详解 TypeScript 高级用法
TypeScript 是一种类型安全的 JavaScript 超集,除了基本类型和对象类型之外,TypeScript 还提供了一些高级类型系统,使得我们可以更好地处理复杂的数据结构和业务逻辑。本文将深...【详细内容】
2023-10-31  Search: TypeScript  点击:(340)  评论:(0)  加入收藏
不要在Typescript中使用Function类型
原文链接:https://www.totaltypescript.com/dont-use-function-keyword-in-typescript翻译:一川在Typescript中不应该使用Function作为一个类型,因为它可以表示任何函数。通常,...【详细内容】
2023-09-27  Search: TypeScript  点击:(279)  评论:(0)  加入收藏
为什么选择 TypeScript,它有什么优点吗?
在当今快速发展的软件开发领域,TypeScript技术的重要性日益凸显。TypeScript是一种由微软开发的开源编程语言,它扩展了JavaScript,并为开发者提供了强大的静态类型检查。首先,Ty...【详细内容】
2023-09-22  Search: TypeScript  点击:(192)  评论:(0)  加入收藏
掌握TypeScript,开启高质量前端之旅
相信TypeScript对于一个前端开发来讲应该是不陌生的,因为作为一个前端开发者来说,不是在学习如何使用TS就是在去学习TS如何使用的路上。为什么这么说呢?一些技术的发展离不开人...【详细内容】
2023-09-22  Search: TypeScript  点击:(283)  评论:(0)  加入收藏
反驳来了!放弃TypeScript?说明你无知!
作者 | Robert Vitonsky编译 | 云中 几天前,汉森 (David Heinemeier Hansson)宣布 Turbo8 即将放弃 TypeScript。我心想:放弃就放弃吧,反正我也不知道 Turbo 8 是什么鬼。 然而...【详细内容】
2023-09-15  Search: TypeScript  点击:(232)  评论:(0)  加入收藏
▌简易百科推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(5)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(27)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(26)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(53)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(57)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(71)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11    CSDN  Tags:JavaScript   点击:(99)  评论:(0)  加入收藏
站内最新
站内热门
站内头条