keyof
keyof操作符接受一个对象类型作为参数,返回该对象属性名组成的字面量联合类型
type Dog = { name: string; age: number; };
type D = keyof Dog; //type D = "name" | "age"
in
in
的右侧一般会跟一个联合类型,使用in
操作符可以对该联合类型进行迭代。 其作用类似JS
中的for...in
或者for...of
下面是一个将接口里的所有属性改为只读属性的demo 其实还可以实现改为可选 必选等属性 原理是一样的
//定义Bigs的接口
interface Bigs {
x: string,
y?: number,
z: boolean,
}
//将接口属性统一更改为只读,用到了Ts的泛型、in操作符
// [k in keyof T]这段代码表示遍历T中的每一个属性,那么T[k]就是每个属性所对应的值,可以简单理解为前者取的是键key,后者取的是值value
type ReadyOnly<T> = {
readonly [k in keyof T]: T[k]
}
let objs: ReadyOnly<Bigs> = {
x: '123',
y: 1,
z: false
}
//就会报错 因为属性是只读属性
objs.z = true //Cannot assign to 'z' because it is a read-only property.(2540)