乐趣区

关于typescript:Typescript中类型Record的使用

咱们能够先来看一下源码是什么

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {[P in K]: T;
};

能够把 K 类型转化为 T 类型。
也就相当于一个 K 到 T 的映射表,能够依据传入的 K 值去查表返回对用的 T 值。
而他的模式就是把 K 当作键值来获取 T。
咱们天经地义能够只是简略的减少对应关系,只实现将输出 key 值,输入相应对象的简略操作:
demo1:

interface EmployeeType {
    id: number
    fullname: string
    role: string
}
 
let employees: Record<number, EmployeeType> = {0: { id: 1, fullname: "John Doe", role: "Designer"},
    1: {id: 2, fullname: "Ibrahima Fall", role: "Developer"},
    2: {id: 3, fullname: "Sara Duckson", role: "Developer"},
}
 
// 比方咱们想获取 1 对应的 Employee,
employees[1]  => {id: 2, fullname: "Ibrahima Fall", role: "Developer"}

然而咱们更多的应用这种办法去依据输出调用相应解决办法,使代码更加标准。
比方咱们有三种角色,某个办法要求当传入不同角色时进行不同解决,然而办法可能比较复杂,咱们想方便管理并且想尽可能的简洁(不采纳大量 ifElse),咱们就能够采纳如下形式。
demo2:


userRole = {
admin: "admin",
student: "student",
teacher: "teacher"
}

interface handeler{getKey();
    handel();}
@injectable
class adminHandeler implement handeler{getKey(): string{return userRole.admin;}
    handel(){. . .}
}

. . .

mainClass {private handelers = {} as Record<string, handeler>;
    construct(@inject adminHandeler adminHandeler){this.addHandeler(adminHandeler);
    }
    
    // 假如这个办法中传入了 role 值并且须要进行分类解决
    mainFunction(role: string){
        // 查找相应 key 并进行解决,执行对应办法
        handelers[role].handel();}
    
    addHandeler(handeler: handeler) {const key = handeler.getKey();
        if(handelers[key]) {
            // 以后 key 已增加相应映射
            return;
        }
        // 如果没有相应映射则增加映射
        handelers[key] = handeler;
    }
}
退出移动版