typescript - typescript :通过键入重命名obj属性

标签 typescript typescript-generics

我有时会使用一个小的实用程序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 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您甚至可以将 Prop 名称大写,以获取oldNameoldDate,在我看来这是更好的选择:
type PrefixAll<T, P extends string>  = {
    [K in keyof T & string as `${P}${Capitalize<K>}`]: T[K]
}

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

关于typescript - typescript :通过键入重命名obj属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64196517/

相关文章:

javascript - 速度 : First Argument was not a property map

javascript - Quasar Q-Table 如何获得过滤或排序的行?

typescript - 禁止显式类型参数或约束联合类型参数以提高类型安全性

reactjs - 如何获取接口(interface)属性的值以影响同一接口(interface)回调中参数的类型

TypeScript 安全函数组合

typescript 泛型 : checking a unique property on a generic type object in if condition doesn't determine the object's type

javascript - Angular 不绑定(bind)的字符串插值

typescript - 使用Webpack为Web部署Electron应用程序时防止发出某些代码

javascript - 刷新 URL 中包含 ID 的页面时找不到bundle.js

typescript - 如何避免在 Typescript 中分布多个泛型类型参数?