返回顶部
首页 > 资讯 > 精选 >TypeScript高级类型有哪些及怎么用
  • 719
分享到

TypeScript高级类型有哪些及怎么用

2023-06-05 03:06:59 719人浏览 薄情痞子
摘要

本篇内容主要讲解“typescript高级类型有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TypeScript高级类型有哪些及怎么用”吧!前言对于有 javascript 基础的

本篇内容主要讲解“typescript高级类型有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TypeScript高级类型有哪些及怎么用”吧!

前言

对于有 javascript 基础的同学来说,入门 typescript 其实很容易,只需要简单掌握其基础的类型系统就可以逐步将 js 应用过渡到 ts 应用。

// jsconst double = (num) => 2 * num// tsconst double = (num: number): number => 2 * num

然而,当应用越来越复杂,我们很容易把一些变量设置为 any 类型,typescript 写着写着也就成了 anyscript。

在讲解高级类型之前,我们需要先简单理解泛型是什么。

泛型是强类型语言中比较重要的一个概念,合理的使用泛型可以提升代码的可复用性,让系统更加灵活。下面是维基百科对泛型的描述:

泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

泛型通过一对尖括号来表示( <> ),尖括号内的字符被称为 类型变量 ,这个变量用来表示类型。

function copy<t>(arg: t): t { if (typeof arg === 'object') { return JSON.parse(  json.stringify(arg) ) } else { return arg }}

这个类型 t,在没有调用 copy 函数的时候并不确定,只有调用 copy 的时候,我们才知道 t 具体代表什么类型。

const str = copy<string>('my name is typescript')

TypeScript高级类型有哪些及怎么用

我们在 vs code 中可以看到 copy 函数的参数以及返回值已经有了类型,也就是说我们调用 copy 函数的时候,给类型变量 t 赋值了 string。其实,我们在调用 copy 的时候可以省略尖括号,通过 ts 的类型推导是可以确定 t 为 string 的。

TypeScript高级类型有哪些及怎么用

高级类型

除了 string、number、boolean 这种基础类型外,我们还应该了解一些类型声明中的一些高级用法。

交叉类型(&)

交叉类型说简单点就是将多个类型合并成一个类型,个人感觉叫做「合并类型」更合理一点,其语法规则和逻辑 “与” 的符号一致。

t & u

假如,我现在有两个类,一个按钮,一个超链接,现在我需要一个带有超链接的按钮,就可以使用交叉类型来实现。

interface button { type: string text: string}interface link { alt: string href: string}const linkbtn: button & link = { type: 'danger', text: '跳转到百度', alt: '跳转到百度', href: 'Http://www.baidu.com'}

联合类型(|)

联合类型的语法规则和逻辑 “或” 的符号一致,表示其类型为连接的多个类型中的任意一个。

t | u

例如,之前的 button 组件,我们的 type 属性只能指定固定的几种字符串

interface button { type: 'default' | 'primary' | 'danger' text: string}const btn: button = { type: 'primary', text: '按钮'}

类型别名(type)

前面提到的交叉类型与联合类型如果有多个地方需要使用,就需要通过类型别名的方式,给这两种类型声明一个别名。类型别名与声明变量的语法类似,只需要把 const 、 let 换成 type 关键字即可。

type alias = t | u

type innertype = 'default' | 'primary' | 'danger'interface button { type: innertype text: string}interface alert { type: buttontype text: string}

类型索引(keyof)

keyof 类似于 object.keys ,用于获取一个接口中 key 的联合类型。

interface button { type: string text: string}type buttonkeys = keyof button// 等效于type buttonkeys = "type" | "text"

还是拿之前的 button 类来举例,button 的 type 类型来自于另一个类 buttontypes,按照之前的写法,每次 buttontypes 更新都需要修改 button 类,如果我们使用 keyof 就不会有这个烦恼。

interface buttonstyle { color: string background: string}interface buttontypes { default: buttonstyle primary: buttonstyle danger: buttonstyle}interface button { type: 'default' | 'primary' | 'danger' text: string}// 使用 keyof 后,buttontypes修改后,type 类型会自动修改 interface button { type: keyof buttontypes text: string}

类型约束(extends)

这里的 extends 关键词不同于在 class 后使用 extends 的继承作用,泛型内使用的主要作用是对泛型加以约束。我们用我们前面写过的 copy 方法再举个例子:

type basetype = string | number | boolean// 这里表示 copy 的参数// 只能是字符串、数字、布尔这几种基础类型function copy<t extends basetype>(arg: t): t { return arg}

TypeScript高级类型有哪些及怎么用

如果我们传入一个对象就会有问题。

TypeScript高级类型有哪些及怎么用

extends 经常与 keyof 一起使用,例如我们有一个方法专门用来获取对象的值,但是这个对象并不确定,我们就可以使用 extends 和 keyof 进行约束。

function getvalue<t, k extends keyof t>(obj: t, key: k) { return obj[key]}const obj = { a: 1 }const a = getvalue(obj, 'a')

TypeScript高级类型有哪些及怎么用

这里的 getvalue 方法就能根据传入的参数 obj 来约束 key 的值。

类型映射(in)

in 关键词的作用主要是做类型的映射,遍历已有接口的 key 或者是遍历联合类型。下面使用内置的泛型接口 readonly 来举例。

type readonly<t> = { readonly [p in keyof t]: t[p];};interface obj { a: string b: string}type readonlyobj = readonly<obj>

TypeScript高级类型有哪些及怎么用

我们可以结构下这个逻辑,首先 keyof obj 得到一个联合类型 'a' | 'b' 。

interface obj { a: string b: string}type objkeys = 'a' | 'b'type readonlyobj = { readonly [p in objkeys]: obj[p];}

然后 p in objkeys 相当于执行了一次 foreach 的逻辑,遍历 'a' | 'b'

type readonlyobj = { readonly a: obj['a']; readonly b: obj['b'];}

最后就可以得到一个新的接口。

interface readonlyobj { readonly a: string; readonly b: string;}

条件类型(u ? x : y)

条件类型的语法规则和三元表达式一致,经常用于一些类型不确定的情况。

t extends u ? x : y

上面的意思就是,如果 t 是 u 的子集,就是类型 x,否则为类型 y。下面使用内置的泛型接口 extract 来举例。

type extract<t, u> = t extends u ? t : never;

如果 t 中的类型在 u 存在,则返回,否则抛弃。假设我们两个类,有三个公共的属性,可以通过 extract 提取这三个公共属性。

interface worker { name: string age: number email: string salary: number}interface student { name: string age: number email: string grade: number}type commonkeys = extract<keyof worker, keyof student>// 'name' | 'age' | 'email'

TypeScript高级类型有哪些及怎么用

工具泛型

typesscript 中内置了很多工具泛型,前面介绍过 readonly 、 extract 这两种,内置的泛型在 typescript 内置的 lib.es5.d.ts 中都有定义,所以不需要任何依赖都是可以直接使用的。下面看看一些经常使用的工具泛型吧。

TypeScript高级类型有哪些及怎么用

partial

type partial<t> = { [p in keyof t]?: t[p]}

partial 用于将一个接口的所有属性设置为可选状态,首先通过 keyof t ,取出类型变量 t 的所有属性,然后通过 in 进行遍历,最后在属性后加上一个 ? 。

我们通过 typescript 写 React 的组件的时候,如果组件的属性都有默认值的存在,我们就可以通过 partial 将属性值都变成可选值。

import react from 'react'interface buttonprops { type: 'button' | 'submit' | 'reset' text: string disabled: boolean onclick: () => void}// 将按钮组件的 props 的属性都改为可选const render = (props: partial<buttonprops> = {}) => { const baseprops = { disabled: false, type: 'button', text: 'hello world', onclick: () => {}, } const options = { ...baseprops, ...props } return ( <button  type={options.type}  disabled={options.disabled}  onclick={options.onclick}>  {options.text} </button> )}

required

type required<t> = { [p in keyof t]-?: t[p]}

required 的作用刚好与 partial 相反,就是将接口中所有可选的属性改为必须的,区别就是把 partial 里面的 ? 替换成了 -? 。

record

type record<k extends keyof any, t> = { [p in k]: t}

record 接受两个类型变量, record 生成的类型具有类型 k 中存在的属性,值为类型 t。这里有一个比较疑惑的点就是给类型 k 加一个类型约束, extends keyof any ,我们可以先看看 keyof any 是个什么东西。

TypeScript高级类型有哪些及怎么用

大致一直就是类型 k 被约束在 string | number | symbol 中,刚好就是对象的索引的类型,也就是类型 k 只能指定为这几种类型。

我们在业务代码中经常会构造某个对象的数组,但是数组不方便索引,所以我们有时候会把对象的某个字段拿出来作为索引,然后构造一个新的对象。假设有个商品列表的数组,要在商品列表中找到商品名为 「每日坚果」的商品,我们一般通过遍历数组的方式来查找,比较繁琐,为了方便,我们就会把这个数组改写成对象。

interface Goods { id: string name: string price: string image: string}const goodsmap: record<string, goods> = {}const goodslist: goods[] = await fetch('server.com/goods/list')goodslist.foreach(goods => { goodsmap[goods.name] = goods})

pick

type pick<t, k extends keyof t> = { [p in k]: t[p]}

pick 主要用于提取接口的某几个属性。做过 todo 工具的同学都知道,todo工具只有编辑的时候才会填写描述信息,预览的时候只有标题和完成状态,所以我们可以通过 pick 工具,提取 todo 接口的两个属性,生成一个新的类型 todopreview。

interface todo { title: string completed: boolean description: string}type todopreview = pick<todo, "title" | "completed">const todo: todopreview = { title: 'clean room', completed: false}

TypeScript高级类型有哪些及怎么用

exclude

type exclude<t, u> = t extends u ? never : t

exclude 的作用与之前介绍过的 extract 刚好相反,如果 t 中的类型在 u 不存在,则返回,否则抛弃。现在我们拿之前的两个类举例,看看 exclude 的返回结果。

interface worker { name: string age: number email: string salary: number}interface student { name: string age: number email: string grade: number}type excludekeys = exclude<keyof worker, keyof student>// 'name' | 'age' | 'email'

TypeScript高级类型有哪些及怎么用

取出的是 worker 在 student 中不存在的 salary 。

omit

type omit<t, k extends keyof any> = pick< t, exclude<keyof t, k>>

omit 的作用刚好和 pick 相反,先通过 exclude<keyof t, k> 先取出类型 t 中存在,但是 k 不存在的属性,然后再由这些属性构造一个新的类型。还是通过前面的 todo 案例来说,todopreview 类型只需要排除接口的 description 属性即可,写法上比之前 pick 精简了一些。

interface todo { title: string completed: boolean description: string}type todopreview = omit<todo, "description">const todo: todopreview = { title: 'clean room', completed: false}

TypeScript高级类型有哪些及怎么用

到此,相信大家对“TypeScript高级类型有哪些及怎么用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: TypeScript高级类型有哪些及怎么用

本文链接: https://lsjlt.com/news/240956.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • TypeScript高级类型有哪些及怎么用
    本篇内容主要讲解“TypeScript高级类型有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TypeScript高级类型有哪些及怎么用”吧!前言对于有 javascript 基础的...
    99+
    2023-06-05
  • TypeScript高级类型有哪些
    本篇内容介绍了“TypeScript高级类型有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Inter...
    99+
    2024-04-02
  • TypeScript的类型有哪些
    这篇文章主要介绍“TypeScript的类型有哪些”,在日常操作中,相信很多人在TypeScript的类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TypeScri...
    99+
    2024-04-02
  • TypeScript中实用类型有哪些
    这篇文章给大家分享的是有关TypeScript中实用类型有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实用类型TypeScript 原生提供了几个有用的实用类型来帮助我们进...
    99+
    2024-04-02
  • TypeScript基本类型有哪些
    今天小编给大家分享一下TypeScript基本类型有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • TypeScript常见类型有哪些
    小编给大家分享一下TypeScript常见类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常见类型(Everyday Types)类型可以出现在很多地方,...
    99+
    2023-06-29
  • TypeScript接口和类型有哪些区别
    今天小编给大家分享的是TypeScript接口和类型有哪些区别,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录接口(interface)类型(type)interface vs t...
    99+
    2023-07-06
  • JavaScript类型有哪些及怎么掌握
    这篇文章主要介绍了JavaScript类型有哪些及怎么掌握的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript类型有哪些及怎么掌握文章都会有所收获,下面我们一起来看看吧。简单来说,类型有助于对可以...
    99+
    2023-06-26
  • javascript的集合类型有哪些及怎么用
    这篇文章主要介绍了javascript的集合类型有哪些及怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript的集合类型有哪些及怎么用文章都会有所收获,下面我...
    99+
    2024-04-02
  • ECMAScript的数据类型有哪些及怎么使用
    这篇“ECMAScript的数据类型有哪些及怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ECMAScript的数据...
    99+
    2023-06-30
  • Typescript中number类型怎么用
    这篇文章主要为大家展示了“Typescript中number类型怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Typescript中number类型怎么用...
    99+
    2024-04-02
  • Typescript中boolean类型怎么用
    这篇文章主要为大家展示了“Typescript中boolean类型怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Typescript中boolean类型怎...
    99+
    2024-04-02
  • Typescript中array类型怎么用
    小编给大家分享一下Typescript中array类型怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!array数组类型,跟...
    99+
    2024-04-02
  • Typescript中string类型怎么用
    这篇文章给大家分享的是有关Typescript中string类型怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。string字符串类型,和javascript一样,可以使用双...
    99+
    2024-04-02
  • Typescript中any类型怎么用
    小编给大家分享一下Typescript中any类型怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!any可以指定任何类型的值...
    99+
    2024-04-02
  • Typescript中enum类型怎么用
    小编给大家分享一下Typescript中enum类型怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!enumenum类型是对...
    99+
    2024-04-02
  • Typescript中tuple类型怎么用
    小编给大家分享一下Typescript中tuple类型怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tuple元组类型,允...
    99+
    2024-04-02
  • Typescript中object类型怎么用
    小编给大家分享一下Typescript中object类型怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!object对象类型...
    99+
    2024-04-02
  • Typescript中never类型怎么用
    这篇文章将为大家详细讲解有关Typescript中never类型怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。nevernever是其他类型(包括null和unde...
    99+
    2024-04-02
  • go语言有哪些类型及怎么表示
    本篇内容主要讲解“go语言有哪些类型及怎么表示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言有哪些类型及怎么表示”吧!go语言的类型有布尔型(bool)、整型(int8、byte、int...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作