打字稿:通过打字重命名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
您甚至可以将道具名称大写以获得oldName
、oldDate
,我认为这更好:
type PrefixAll<T, P extends string> =
[K in keyof T & string as `$P$Capitalize<K>`]: T[K]
Playground Link
注意:我改为前缀,而不是后缀,因为那是你在最后指定的转换,但后缀同样简单,只需将模板文字类型更改为 $K$P
【讨论】:
以上是关于打字稿:通过打字重命名obj属性的主要内容,如果未能解决你的问题,请参考以下文章