TypeScript如何获取命名空间下接口属性的编译时类型?
提取接口中数组元素类型的简洁方案
嘿,我完全懂你的痛点——想要复用接口里某个属性的类型,尤其是当这个类型是内联声明或者以后可能变更的时候,硬复制类型不仅麻烦还容易出错。你之前尝试的写法报错,核心原因是对TypeScript里类型与值的访问方式搞混了,咱们来一步步解决:
首先,先确认你的Contracts.ICustomer接口结构大概是这样的(得确保接口是导出的):
namespace Contracts { export interface ICustomer { identities: { id: string; displayName: string }[]; // 其他属性... } }
正确的简洁写法
直接用类型索引访问就能搞定,不需要任何虚拟函数:
type IIdentity = Contracts.ICustomer['identities'][number];
为什么这个写法有效?
Contracts.ICustomer['identities']:因为ICustomer是一个类型(接口),不是运行时的值,所以不能用.来访问它的属性,必须用字符串字面量的索引方式来获取该属性的类型(这里拿到的是数组类型{ id: string; displayName: string }[])。- 后面的
[number]:这是TypeScript里提取数组元素类型的标准语法,作用是从数组类型中取出单个元素的类型。
为什么你之前的写法报错?
你写的Contracts.ICustomer.identities[number]用了.访问,这是访问值的属性的方式,但ICustomer是类型,不是值,所以TypeScript会报错说“ICustomer不是Contracts的成员”——因为它确实不是运行时的成员,只是类型层面的定义。
关于typeof的误区
你尝试过的typeof组合没用,是因为typeof的作用是从运行时值中获取类型,而ICustomer是接口(纯类型),没有对应的运行时值,所以typeof在这里完全不适用。
这种方案完全是类型层面的操作,没有任何额外的运行时代码,比你之前用虚拟函数+ReturnType的方式简洁太多啦!
内容的提问来源于stack exchange,提问作者Jørgen Tvedt
相关产品推荐
相关产品推荐

