打字稿:使用打字重命名 obj 属性

iPh*_*ian 6 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,
};
*/
Run Code Online (Sandbox Code Playgroud)

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

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

{
    [K in keyof T]: whatever
};
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 11

你很幸运。虽然这在当前版本的打字稿中是不可能的,但很快就会实现。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
Run Code Online (Sandbox Code Playgroud)

游乐场链接

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

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

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

Run Code Online (Sandbox Code Playgroud)

游乐场链接

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