代码之家  ›  专栏  ›  技术社区  ›  Alex

基于另一个类型的键值将约束应用于类型

  •  0
  • Alex  · 技术社区  · 3 年前

    我有一个基本类型def:

    export interface Person {
        name: string;
        age: number;
        created: Date;
        ...
    }
    

    这种类型的数据来自一个json文件。 JSON.parse不生成 Date 从字符串,所以我想使用第二个“reviver”参数,它允许您修改基于键解析的值。

    因此,首先我创建了一个需要修改的道具列表:

    const deserializeMap: Mapper = {
        created: v => new Date(v)
    }
    

    但我不知道如何定义“Mapper”类型。

    应该是这样的:

    type Mapper = {
        <K extends keyof Person >K: (value: any) => Person [K]
    };
    

    因此,根据我定义的属性,函数返回的值必须与Person类中的属性类型相匹配

    1 回复  |  直到 3 年前
        1
  •  1
  •   mochaccino    3 年前

    可以使用映射类型来定义映射器类型:

    type Mapper = {
        [K in keyof Person]: (value: any) => Person[K];
    };
    

    然后你可以说你的反序列化映射满足 Partial<Mapper> :

    const deserializeMap = {
        created: v => new Date(v)
    } satisfies Partial<Mapper>;
    

    根据反序列化映射的使用方式,您可能需要使用类型注释:

    const deserializeMap: Partial<Mapper> = {
        created: v => new Date(v)
    };
    

    Playground