打字稿:通过打字重命名obj属性

Posted

技术标签:

【中文标题】打字稿:通过打字重命名obj属性【英文标题】:Typescript: Rename obj properties with typing 【发布时间】: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
;

【问题讨论】:

【参考方案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

【讨论】:

以上是关于打字稿:通过打字重命名obj属性的主要内容,如果未能解决你的问题,请参考以下文章

具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]

打字稿:通过传入命名参数的构造函数创建类?

如何在 Angular 2 中包含打字稿自定义类型定义?

模块与命名空间:组织大型打字稿项目的正确方法是啥?

typescript 通用重试函数装饰器(打字稿)

angular-ui-router 使用打字稿嵌套命名视图