Typescript 将类型缩小为索引签名的属性

Typescript 将类型缩小为索引签名的属性,typescript,typescript-typings,Typescript,Typescript Typings,我正在构建一个类型定义集,它在用户提供的表示其状态模型的类型上运行 我需要能够做的一件事是,在我生成使用并暴露于它们的新类型时,缩小它们模型的类型 我在缩小作为索引签名的对象的属性时遇到问题 例如: /** *仅拾取特定类型的关键点 *取自typelevel ts */ 类型KeysOfType={ [K]在A]-?:A[K]扩展B?K:从不; }[keyof A]; 接口地址{ 街道:字符串; 邮政编码:string ;; } 接口人{ //我想把范围缩小到这片土地 收藏夹编号:{ [id:字

我正在构建一个类型定义集,它在用户提供的表示其状态模型的类型上运行

我需要能够做的一件事是,在我生成使用并暴露于它们的新类型时,缩小它们模型的类型

我在缩小作为索引签名的对象的属性时遇到问题

例如:

/** *仅拾取特定类型的关键点 *取自typelevel ts */ 类型KeysOfType={ [K]在A]-?:A[K]扩展B?K:从不; }[keyof A]; 接口地址{ 街道:字符串; 邮政编码:string ;; } 接口人{ //我想把范围缩小到这片土地 收藏夹编号:{ [id:字符串]:数字; }; 名称:字符串; 地址:地址; } 键入PersonIndexSignatures=Pick< 人 键值类型 >; 键入PersonIndexSignaturesKeys=PersonIndexSignatures的键; //收藏夹编号|地址 正如您在上面所看到的,我试图基于{[key:string]:any;}缩小Person的范围,这会产生FavoriteNumber和address键


有没有什么技巧可以让我将类型缩小到仅限FavoriteNumber?

这里有一种方法:

首先,我们如何区分Person[收藏夹号码]和Person[地址]之间的区别

这看起来很有希望:

类型A=个人的钥匙[收藏夹编号]; //字符串|编号 B类=个人[地址]的钥匙; //街道|邮政编码 字符串扩展A而不是B:

类型A=个人[收藏夹编号]的字符串?真:假; //真的 类型B=人员[地址]的字符串?真:假; //假的 我们可以在你的keystoftype中破解该检查,你可能可以清理它:

类型KeysOfType={ [K]扩展了B?字符串扩展了[K]的键?K:从不:从不; }[keyof A]; 然后:

键入PersonIndexSignaturesKeys=PersonIndexSignatures的键; //偏爱号码