【问题标题】:Typescript: Rename obj properties with typing打字稿:通过打字重命名obj属性
【发布时间】:2021-01-19 14:30:45
【问题描述】:

我有时使用的一个小实用程序 func (js),我希望打字能像这样工作:

// original js untypified
function prefixProperties(obj, prefix) {
    let out = {};
    for (let propt in obj) {
        out[prefix + propt] = obj[propt];
    }
    return out;
}

let x : { num: number, date: Date } = { ... };
let y = prefixProperties(x, 'old');
/*
be great if typeof y was:
{
    oldnum: number,
    olddate: Date,
};
*/

或者最具体的就是这样的功能。

我考虑过元组映射,但我想它们不会让您更改键的名称。

{
    [K in keyof T]: whatever
};

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    你很幸运。虽然这在当前版本的 typescript 中是不可能的,但很快就会实现。 Typescript 4.1(将于 2020 年 11 月发布)将增加对 Template literal types and mapped type 'as' clauses 的支持。有了这个新功能,您可以编写:

    type PrefixAll<T, P extends string>  = {
        [K in keyof T & string as `${P}${K}`]: T[K]
    }
    
    function prefixProperties<T, P extends string>(obj: T, prefix: P): PrefixAll<T, P> {
        let out = {} as Record<string, unknown>;
        for (let propt in obj) {
            out[prefix + propt] = obj[propt];
          }
        return out as PrefixAll<T, P>;
    }
    
    let x : { num: number, date: Date } = { ... };
    let y = prefixProperties(x, 'old');
    
    y.olddate
    y.oldnum
    

    Playground Link

    目前不可能的部分是as `${P}${K}` 。这部分将使用模板文字类型将P(前缀)连接到当前属性K,并且as 子句将使这种连接的结果成为结果对象中的新属性,而不是K

    您甚至可以将道具名称大写以获得oldNameoldDate,我认为这更好:

    type PrefixAll<T, P extends string>  = {
        [K in keyof T & string as `${P}${Capitalize<K>}`]: T[K]
    }
    
    

    Playground Link

    注意:我改为前缀,而不是后缀,因为那是你在最后指定的转换,但后缀同样简单,只需将模板文字类型更改为 ${K}${P}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2021-09-23
      • 2018-05-17
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      相关资源
      最近更新 更多