keyof 操作符

keyof 操作符 会返回该对象属性名组成的一个字符串或者 字面量 的联合类型

  1. type Point = {x:number,y:number}
  2. type P = keyof Point //keyof Point

如果是 一个索引签名,则是 直接返回这些类型

  1. type Arraysh = {
  2. [n:number]:unknown
  3. }
  4. type A = keyof Arraysh //number
  5. type Mapsh = {
  6. [k:string]:boolean
  7. }
  8. type M = keyof Mapsh //string | number
  9. //这里之所以是 string | number, 是因为js中对象的属性名是会被强制转字符串的
  10. //所以obj[0] obj['0']一致
数字字面量联合类型
  1. const NumericObject = {
  2. [1]: "冴羽一号",
  3. [2]: "冴羽二号",
  4. [3]: "冴羽三号"
  5. };
  6. NumericObject作为值 是不能直接keyof ,先typeof 返回
  7. type result = {
  8. 1:string
  9. 2:string
  10. 3:string
  11. }
  12. 然后keyof 返回 1|2|3
  13. type result = keyof typeof NumericObject
keyof应用
  1. function getProperty<T, K extends keyof T>(obj: T, k: K) {
  2. return obj[k];
  3. }
  4. let x = { a: 1, b: 2 };
  5. getProperty(x, "a");
typeof操作符

typeof 用于获取类型 一般是和其他操作符搭配使用

  1. function f(){
  2. return {x:10,y:3}
  3. }
  4. //需要先typeof得到 函数描述类型 再ReturnType
  5. //声明函数本身是一个值 而不是 类型
  6. type P = ReturnType<typeof f>
索引访问操作符
  1. const App = ['Taobao','Tmall','Alipay'] as const
  2. type app = typeof App[number]
  3. function getPhoto(app:app){}
  4. getPhoto('Tabobao') // 报错 不是符合的名称
  5. //-------------------
  6. const App = ['Taobao','Tmall','Alipay'] as const
  7. 这个相当于是 const App:readonly['Taobao','Tmall','Alipay']
  8. 它变成了一个字面量,此时再通过 typeof 得到所有索引 就变成一个字符串联合类型
映射类型
  1. type Opt<T> = {
  2. [Property in keyof T]:boolean
  3. }
  4. type Fe = {
  5. dm:()=>void
  6. np:()=>void
  7. }
  8. //此时Fo 已经是 布尔结果的数据了
  9. type Fo = Opt<Fe>
映射修饰符
    • 操作符
  1. type Cm<T> = {
  2. -readonly [p in keyof T]:T[p]
  3. }
  4. type lk = {
  5. readonly id:string
  6. readonly name:string
  7. }
  8. type uk = Cm<lk>
as映射
  1. type Getters<T> = {
  2. [p in keyof T as `get${Capitalize<string & p>}`]:()=>T[p]
  3. }
  4. interface Person{
  5. name:string
  6. age:number
  7. }
  8. type Lz = Getters<Person>
  9. type Rk<T> = {
  10. [p in keyof T as Exclude<p,'kind'>]:T[p]
  11. }
  12. interface Ce{
  13. kind:'cc'
  14. radius:number
  15. }
  16. type kc = Rk<Ce>
  1. type Ep<T> = {
  2. [p in keyof T]:T[p] extends {pii:true}?true:false
  3. }
  4. type Dbf = {
  5. id:{format:"inc"}
  6. name:{type:string,pii:true}
  7. }
  8. type on = Ep<Dbf>