资讯专栏INFORMATION COLUMN

分享几个TypeScript泛型的使用场景

骞讳护 / 2554人阅读

摘要:最近使用写了一个项目过程中不断感受到的魅力现在来分享几个业务中关于泛型的场景深度内置了一个类型用于把一个类型的成员属性设置为成可选模式例如类型中有两个成员属性如果我们要把这个类型赋予变量那必须拥有和两个属性现在我们要让的两个属性都变为可选可

最近使用TypeScript写了一个项目,过程中不断感受到TypeScript的魅力,现在来分享几个业务中关于泛型的场景

1. 深度Partial

TS内置了一个Partial类型,用于把一个类型的成员属性设置为成可选模式,例如

type Person = {
  name: string;
  age: number;
}

Person类型中有两个成员属性,如果我们要把这个类型赋予变量tom,那tom必须拥有nameage两个属性

let tom:Person = {
    name: "tom",
    age: 20
};

现在我们要让Person的两个属性都变为可选,可以使用Partial类型进行转换

type PartialPerson = Partial;

let partialPerson: PartialPerson = {
  name: "tom"
};

这时PartialPersonnameage属性都已经变为可选的了,但是如果我们在Person中再加一点东西

type Person = {
  name: string;
  age: number;
  contact: {
    email: string;
    phone: number;
    wechat: string;
  }
}

现在我们加入了一个contact属性值是一个对象,如果我们想把contact里面的属性也变为可选Partial就不灵了

可以看到Partial是把contact变成了可选而不是里面的属性,插个题外话通常的做法是为contact另外创建一个类型,如果是这样的话Partial就可以用了,但是我们不使用这种方法,我们先来看看TS是怎么定义Partial

/**
 * Make all properties in T optional
 */
type Partial = {
    [P in keyof T]?: T[P];
};

很容易理解关键点是在?:上,现在我们改造一下

type DeepPartial = {
  [P in keyof T]?: T[P] extends Object ? DeepPartial : T[P];
}

可以看到改造的DeepPartialPartial差别在把直接赋值T[P]换成了T[P] extends Object ? DeepPartial : T[P], 即判断T的属性P的类型是否是Object然后进行再次DeepPartial或者返回T[P]的类型


这时编译器就不会再提示错误了

2. 更智能的array_column函数

在PHP中有一个array_column函数,用于在数组中提取一列的内容,用JavaScript表现就是

function array_column(arr, key) {
  return arr.map(item => item[key])
}

假如现在有一个persons数组

type Person = {
  name: string;
  age: number;
}

let persons: Person[] = [];

我们需要提取数组中的name属性,可以很方便的使用Array.map方法提取,但是如果又有别的数组需要提取,我们可以实现一个更优雅的array_column函数

function array_column(input: T[], key: K) {
  return input.map(item => item[key])
}

现在我们使用这个函数提取persons数组


可以看到当我们输入persons时,编辑器已经推断出了key的类型,再来一个animals数组

3. Proxy

在刚开始学习TS的时候看官方文档有一个Proxy的例子,只给出了类型声明但却没有给出实现,当时花了不少时间琢磨,现在来实现它

class Proxy{
  constructor(private data: T) { }

  get(key: K) {
    return this.data[key]
  }

  set(key: K, value: V) {
    this.data[key] = value;
  }
}

可以看到Proxy类提供了getter方法getsetter方法set,现在我们基于上面的Person类型创建一个Proxy实例

let person: Person = {
  name: "tom",
  age: 18
};

let proxy = new Proxy(person);

现在我们来看看调用get方法


可以看到编辑器也推断出了参数key的类型,再来看看set方法


get方法一样,编辑器也推断出了参数key的类型,同时也推断出了参数value的类型为string

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105657.html

相关文章

  • 十分钟教你理解TypeScript中的泛型

    摘要:进入其下载的目录,并按照提示进行安装。理解中心思想刚才使用类型导致的问题,可以用中的泛型来解决。你可以在泛型声明中继承它这告诉,可使用任何具有属性的类型。在中使用泛型的主要原因是使类型,类或接口充当参数。 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 showImg(https://segmentfault.com/img/bVbuXpw?...

    hosition 评论0 收藏0
  • 一篇文章学会 TypeScript

    摘要:接下来来看一段代码示例语法与语言比较当类型不对的时候,会提示错误编译后语法联想大致可以把它看成是加了类型系统的。 一篇文章学会 TypeScript (内部分享标题:TypeScript 基础) 这篇文章是我在公司前端小组内部的演讲分享稿,目的是教会大家使用 TypeScript,这篇文章虽然标着基础,但我指的基础是学完后就能够胜任 TypeScript 的开发工作。从我分享完的效果来...

    itvincent 评论0 收藏0
  • 为vue3学点typescript, 泛型

    摘要:往期第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型插一课本来打算接着上节课把高级类型都讲完但是写着写着我发现高级类型中有很多地方都需要泛型的知识那么先插一节泛型什么是类型变量和泛型变量的概念我们都知道可以表示任意数据类型 往期 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 插一课 本来打算接着上节课, ...

    tianlai 评论0 收藏0
  • typescript - 一种思维方式

    摘要:怎么影响了我的思考方式对前端开发者来说,能强化了面向接口编程这一理念。使用的过程就是在加深理解的过程,确实面向接口编程天然和静态类型更为亲密。 电影《降临》中有一个观点,语言会影响人的思维方式,对于前端工程师来说,使用 typescript 开发无疑就是在尝试换一种思维方式做事情。 其实直到最近,我才开始系统的学习 typescript ,前后大概花了一个月左右的时间。在这之前,我也在...

    CKJOKER 评论0 收藏0
  • TypeScript - 一种思维方式

    摘要:怎么影响了我的思考方式对前端开发者来说,能强化了面向接口编程这一理念。使用的过程就是在加深理解的过程,确实面向接口编程天然和静态类型更为亲密。摘要: 学会TS思考方式。 原文:TypeScript - 一种思维方式 作者:zhangwang Fundebug经授权转载,版权归原作者所有。 电影《降临》中有一个观点,语言会影响人的思维方式,对于前端工程师来说,使用 typescript 开...

    noONE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<