Typescript 基础进阶(四) — 泛型拓展(二)

166 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

🎉前言

这是学习 TypeScript 的基础进阶的第四章节,我将会把我学习到的知识总结起来供大家参考。

之前已经学习了泛型的基本用法,接下来我们拓展一下对于泛型的其他知识点。

🐣 Partial

Partial 用于将一个类型中的所有属性转变为可选属性。

看例子:

interface Animal {
  name: string;
  age: number;
}
​
const dog1: Animal={
  name:'阿黄',
  age: 4
}
​
// 报错, 缺少age属性
const dog2: Animal={
  name:'阿黄',
}

使用 Partial 修改例子:

const dog2:Partial<Animal> = {
 name: '阿黄', // ok
}

原理:

type Partial<T> = { [P in keyof T]?: T[P]; }

在上述例子中,我们使用 Partial 将我们传入的类型事先通过 keyof 获取对应的属性名,之后使用 in 关键字进行遍历,将对应的属性类型赋值给 P ,添加可选符号 ?,让属性成为可选属性。

🐥 ​Required

啊哈~~ 可以把所有属性变成可选的,那肯定就有方法让所有属性变成必选的啦。

Vue 中我们实现一个子组件时,为了让它的某个 props 属性一定要传值时,我们会加入 required:true 属性进行声明。

//element-ui中form.vue
props: {
    model: {
      type: Object,
      required: true
    }
}

如果不传入 model 就会报错:[Vue warn]: Missing required prop: "model"

好了,有所了解之后,我们在 TypeScript 中看看如何使用。

看例子:

interface Animal {
  name: string;
  age?: number;  // age可选
}
​
// ok
const dog:Animal={
  name:'阿黄'
}

使用 Required 修改例子:

// 报错;类型 "{ name: string; }" 中缺少属性 "age",但类型 "Required<Animal>" 中需要该属性。ts(2741)
const dog:Required<Animal> ={
  name:'阿黄'
}

原理:

type Required<T> = { [P in keyof T]-?: T[P]; }

跟之前的 Partial 有点像,不同的是这里的 ? 变成了 -? ,意思是将可选属性的 ? 符号去掉,变为必选属性。

🐤 ​Readonly

Readonly 用于将一个类型中的属性转换为可读属性,也即是后续不能修改这些属性值。

TypeScript 中,还有一个 readonly,它是给一个接口声明可读属性,而这个 Readonly 则是给一个接口里的所有属性声明可读属性。

看例子:

// readonly 例子
interface Animal {
  readonly name: string;
  age: number;
}
const dog:Animal ={
  name:'阿黄',
  age: 4
}
​
dog1.name = "小黑";  // error
dog1.age = 18;      // ok// Readonly 例子
interface Animal2 {
  name: string;
  age: number;
}
const dog2:Readonly<Animal2> ={
  name:'小黑',
  age: 4
}
​
dog2.name = "小白";  // error
dog2.age = 18;      // error

原理:

type Readonly<T> = { readonly [P in keyof T]: T[P]; }

其实就是 Readonly 将我们传入的类型事先通过 keyof 获取对应的属性名,之后使用 in 关键字进行遍历,将对应的属性类型赋值给 P ,再给所有的属性加上 readonly 就好了。

✨总结

以上就是本次分享的全部内容~~

如果觉得文章写得不错,对你有所启发的,请不要吝啬 点个 关注 并在 评论区 留下你宝贵的意见哦~~😃