映射类型,对象属性批量设置约束
批量设置属性全部只读
interface ObjInterface {
a: number;
b: number;
c: number;
}
//全部设为只读
type readonlyObj = Readonly<ObjInterface>;
鼠标移动到readonlyObj
可以发现所有的属性全部设置为只读了。
type readonlyObj = {
readonly a: number;
readonly b: number;
readonly c: number;
}
我们按住ctrl+鼠标左键点击Readonly
;可以看到ts的相关实现:
type Readonly<T> = {
readonly [P in keyof T]: T[P];
}
ts官方定义了一个Readonly类型,它有一个泛型T,类型的属性会通过keyof
拿到T的所有key的联合类型,然后P in
相当于进行了一个for循环,把联合类型中的对应的每个key值都赋值到P上,P自身又readonly
了,值则是T[P],可以理解为对象obj[key]
。
批量可选
interface ObjInterface {
a: number;
b: number;
c: number;
}
//全部设为可选
type partialObj = Partial<ObjInterface>;
鼠标移动到partialObj
可以看到所有的属性都变成了可选
type partialObj = {
a?: number;
b?: number;
c?: number;
}
我们按住ctrl+鼠标左键点击Partial
;可以看到ts的相关实现:
type Partial<T> = {
[P in keyof T]?: T[P];
}
原理和批量只读一样,只是这里改用了?:
可选了。
指定属性key生成新的声明
我们需要生成一个新的类型声明,但是只需要ObjInterface
的a和b属性。
interface ObjInterface {
a: number;
b: number;
c: number;
}
//生成指定属性声明
type pickObj = Pick<ObjInterface,"a"|"b">
得到如下:
type pickObj = {
a: number;
b: number;
}
Pick
的实现:
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
}
它有两个泛型,第一个是源参,第二个是需要使用到的key值联合类型,并且必须是来源于T的。
剩下就是in循环了。
已知属性赋值到指定key并生成新的声明
比如说我有一个对象,里面有a、b、c
三个属性都是布尔值,这三个key对应的都是同一个类型。
interface ObjInterface {
a: number;
b: number;
c: number;
}
//已知属性赋值到指定key并生成新的声明
type recordObj = Record<"a"|"b"|"c",ObjInterface>
得到:
type recordObj = {
a: ObjInterface;
b: ObjInterface;
c: ObjInterface;
}
Record实现:
type Record<K extends string, T> = {
[P in K]: T;
}
这里就不太清楚为啥K要继承string
实战例子:
interface CatInfo {
age: number;
breed: string;
}
type CatName = "miffy" | "boris" | "mordred";
const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};
cats.boris;
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据