TypeScript: 重命名带有类型的对象属性

8

这是我有时使用的一个小实用函数(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
};
1个回答

14
你很幸运。虽然在当前版本的TypeScript中不可能实现,但很快就会有了。TypeScript 4.1(将于2020年11月发布)将添加模板文字类型和映射类型 'as' 子句的支持。使用这个新功能,你可以编写如下内容:
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

游乐场链接

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

你甚至可以将属性名大写,得到 oldNameoldDate,我认为这样更好:

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

游乐场链接

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接