gpt4 book ai didi

typescript - 如何使用 Typescript 选择和重命名某些键?

转载 作者:行者123 更新时间:2023-12-01 11:12:00 26 4
gpt4 key购买 nike

我有一个接口(interface)User :

interface User {
_id : string;
name : string;
email : string;
password: string;
phone : number;
}

我还有一个接口(interface) UpdatedBy :

interface UpdatedUser {
id : string;
name: string;
}

我知道我可以使用 Pick , 但我想重命名 _ididUpdatedUser界面。

type UpdatedUser = Pick<User, '_id' | 'name'>; // How can I turn _id into id?

更新:我基本上想做一个更干净的版本:

export interface UpdatedUser extends Pick<User, 'name'> {
id : Extract<User, '_id'>;
}

最佳答案

没有用于重命名的内置类型 Pick ,幸运的是,我们可以通过合理的努力创造一个。
简单变体

type IdRenamed = Omit<User, "_id"> & { id: User["_id"] }
// { name: string; email: string; password: string; phone: number; id: string;}
Playground
单一属性的动态版本
type PickRename<T, K extends keyof T, R extends PropertyKey> =
Omit<T, K> & { [P in R]: T[K] }

type T21 = PickRename<User, "_id", "id"> // same type as above
type T22 = PickRename<User, "foo", "id"> // error, foo is no property
Playground
TS 4.1替代方案:使用 mapped type as clauses .它的优点是 readonly或可选的 ( ? ) 属性修饰符被保留(参见同态映射类型 12 了解更多详细信息)。
type PickRename<T, K extends keyof T, R extends PropertyKey> = {
[P in keyof T as P extends K ? R : P]: T[P]
} // type instantiation same as previous example
Playground
多个属性的动态版本
type PickRenameMulti<T, R extends
{ [K in keyof R]: K extends keyof T ? PropertyKey : "Error: key not in T" }
> = Omit<T, keyof R> & UnionToIntersection<
{ [P in keyof R & keyof T]: { [PP in R[P]]: T[P] } }[keyof R & keyof T]
>

type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends
((k: infer I) => void) ? I : never

type T31 = PickRenameMulti<User, { _id: "id"; name: "firstName" }>
type T32 = PickRenameMulti<User, { foo: "id" }> // error, foo is no property
注意:见伟大的 UnionToIntersection 键入以获取有关帮助程序的更多详细信息。
Playground
TS 4.1 再次简化了语法并生成同态映射类型:
type PickRenameMulti<T, R extends
{ [K in keyof R]: K extends keyof T ? PropertyKey : "Error: key not in T" }
> = { [P in keyof T as P extends keyof R ? R[P] : P]: T[P] }
Playground
TS 4.1:删除 _所有属性键的前缀
type DropUnderscore<T> = {
[K in keyof T as K extends `_${infer I }` ? I : K]: T[K]
};
type T4 = DropUnderscore<User> // "_id" and "_email" renamed to "id", "email"
Playground

关于typescript - 如何使用 Typescript 选择和重命名某些键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com