keyof 操作符
keyof 操作符 会返回该对象属性名组成的一个字符串或者 字面量 的联合类型
type Point = {x:number,y:number}type P = keyof Point //keyof Point
如果是 一个索引签名,则是 直接返回这些类型
type Arraysh = {[n:number]:unknown}type A = keyof Arraysh //numbertype 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:string2:string3:string}然后keyof 返回 1|2|3type 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 consttype 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:()=>voidnp:()=>void}//此时Fo 已经是 布尔结果的数据了type Fo = Opt<Fe>
映射修饰符
- 操作符
 
type Cm<T> = {-readonly [p in keyof T]:T[p]}type lk = {readonly id:stringreadonly name:string}type uk = Cm<lk>
as映射
type Getters<T> = {[p in keyof T as `get${Capitalize<string & p>}`]:()=>T[p]}interface Person{name:stringage: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>
