能否定义含固定属性与任意字符串键属性的TypeScript接口?
TypeScript接口同时包含固定属性与任意属性的可行性说明
你写的这个接口不可行,原因是TypeScript对接口的固定属性和索引签名有类型兼容性要求:所有固定属性的类型必须属于索引签名定义的类型范围。
你的代码里,id是number类型、somethingElse是Date类型,这两个类型都不在索引签名string | null的覆盖范围内,所以TypeScript会直接抛出类型不兼容的错误。
两种正确的实现方式
方式一:扩展索引签名的类型范围
把索引签名的类型调整为包含所有固定属性的类型,确保类型兼容:interface Model { id: number; something: string; somethingElse: Date; [key: string]: string | number | Date | null; }方式二:使用交叉类型组合
拆分固定属性和任意属性的定义,通过交叉类型合并:interface ModelFixedProps { id: number; something: string; somethingElse: Date; } type Model = ModelFixedProps & { [key: string]: string | null };注意:这种方式下,若通过索引(比如
model['id'])访问固定属性,TypeScript会推断其类型为never(因为number和string | null没有交集),所以如果需要通过索引访问固定属性,更推荐第一种方式。
内容的提问来源于stack exchange,提问作者Mikelgo
相关产品推荐
相关产品推荐

