2

我们可以先来看一下源码是什么

/**
 * 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 handler{
    getKey();
    handel();
}
@injectable
class AdminHandeler implement handler{
    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;
    }
}

李明
441 声望19 粉丝