TypeScript中如何声明类型与指定接口属性类型一致的变量
解决方案
直接用TypeScript内置的**索引访问类型(Indexed Access Types)**就能实现这个需求,不需要手动同步类型。
你的原有IUser接口定义:
export interface IUser { id: string; displayName: string; email?: string; imageUrl?: string; disabled?: boolean; since?: Date; }
要声明和IUser的id属性同类型的变量,写法如下:
let id: IUser['id']; // 此时id的类型自动关联为string,和IUser.id的类型完全同步
说明
- 你设想的
typeof IUser.id写法不生效的原因是:IUser是TS层面的类型定义,不是JS运行时的实际值,typeof运算符只能作用于实际存在的JS值,不能直接作用在类型上。 - 用
IUser['属性名']的写法可以精准获取接口对应属性的类型,后续你修改IUser里对应属性的类型时,所有用这种方式声明的变量类型会自动同步更新,不需要手动修改。比如后续你把IUser的id类型调整为number:
上面声明的export interface IUser { id: number; // 类型修改为number // 其他属性不变 }id变量的类型会自动变为number,不需要做任何额外调整。 - 这个语法对可选属性也完全适配,比如你要获取
email的类型,写IUser['email']得到的就是string | undefined,和接口定义的可选属性类型完全一致。
内容的提问来源于stack exchange,提问作者Giorgi Gvimradze
相关产品推荐
相关产品推荐

