keyof 操作符
keyof 操作符 会返回该对象属性名组成的一个字符串或者 字面量 的联合类型
type Point = {x:number,y:number}
type P = keyof Point //keyof Point
如果是 一个索引签名,则是 直接返回这些类型
type Arraysh = {
[n:number]:unknown
}
type A = keyof Arraysh //number
type Mapsh = {
[k:string]:boolean
}
type M = keyof Mapsh //string | number
//这里之所以是 string | number, 是因为js中对象的属性名是会被强制转字符串的
//所以obj[0] obj['0']一致
数字字面量联合类型
const NumericObject = {
[1]: "冴羽一号",
[2]: "冴羽二号",
[3]: "冴羽三号"
};
NumericObject作为值 是不能直接keyof ,先typeof 返回
type result = {
1:string
2:string
3:string
}
然后keyof 返回 1|2|3
type result = keyof typeof NumericObject
keyof应用
function getProperty<T, K extends keyof T>(obj: T, k: K) {
return obj[k];
}
let x = { a: 1, b: 2 };
getProperty(x, "a");
typeof操作符
typeof 用于获取类型 一般是和其他操作符搭配使用
function f(){
return {x:10,y:3}
}
//需要先typeof得到 函数描述类型 再ReturnType
//声明函数本身是一个值 而不是 类型
type P = ReturnType<typeof f>
索引访问操作符
const App = ['Taobao','Tmall','Alipay'] as const
type app = typeof App[number]
function getPhoto(app:app){}
getPhoto('Tabobao') // 报错 不是符合的名称
//-------------------
const App = ['Taobao','Tmall','Alipay'] as const
这个相当于是 const App:readonly['Taobao','Tmall','Alipay']
它变成了一个字面量,此时再通过 typeof 得到所有索引 就变成一个字符串联合类型
映射类型
type Opt<T> = {
[Property in keyof T]:boolean
}
type Fe = {
dm:()=>void
np:()=>void
}
//此时Fo 已经是 布尔结果的数据了
type Fo = Opt<Fe>
映射修饰符
- 操作符
type Cm<T> = {
-readonly [p in keyof T]:T[p]
}
type lk = {
readonly id:string
readonly name:string
}
type uk = Cm<lk>
as映射
type Getters<T> = {
[p in keyof T as `get${Capitalize<string & p>}`]:()=>T[p]
}
interface Person{
name:string
age:number
}
type Lz = Getters<Person>
type Rk<T> = {
[p in keyof T as Exclude<p,'kind'>]:T[p]
}
interface Ce{
kind:'cc'
radius:number
}
type kc = Rk<Ce>
type Ep<T> = {
[p in keyof T]:T[p] extends {pii:true}?true:false
}
type Dbf = {
id:{format:"inc"}
name:{type:string,pii:true}
}
type on = Ep<Dbf>