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 oldName,oldDate我认为这更好:
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}
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |