我有一个接口User
:
interface User {
_id : string;
name : string;
email : string;
password: string;
phone : number;
}
我有另一个接口UpdatedBy
:
interface UpdatedUser {
id : string;
name: string;
}
我知道我可以使用Pick
,但我想在UpdatedUser
接口中将_id
重命名为id
。
type UpdatedUser = Pick<User, '_id' | 'name'>; // How can I turn _id into id?
更新:我基本上想做一个更干净的版本:
export interface UpdatedUser extends Pick<User, 'name'> {
id : Extract<User, '_id'>;
}
4条答案
按热度按时间lb3vh1jj1#
对于重命名的
Pick
,没有内置类型,幸运的是,我们可以通过合理的努力创建一个。简单变体
Playground
单属性动态版本
Playground
TS 4.1备选方案:使用mapped type
as
clauses。它的优点是保留了readonly
或可选的(?
)属性修饰符(更多细节请参见同态Map类型1,2)。Playground
多属性动态版本
注意:有关帮助器的更多细节,请参阅
UnionToIntersection
类型。Playground
TS 4.1再次简化了语法并产生同态Map类型:
Playground
TS 4.1:从所有属性键中删除
_
前缀Playground
kmb7vmvb2#
一个 * 稍微 * 干净的版本将是...
...但我不确定如何按您的建议在运行时重命名它。这是一个有趣的用例。
v9tzhpje3#
ford04's answer的问题是它没有保留重命名键的optional/required属性。下面是如何在考虑键是可选还是必需的情况下重命名一个 prop :
你可以将同样的事情应用到答案中那些更高级的类型,例如,如果你想一次重命名多个键。
Playground
nfg76nw04#
我真的很喜欢ford04's多属性的动态版本,但我希望可选键保持可选,就像在Alireza Mirian's answer中一样。
所以我在这里把两者结合起来。