我有一个带有单个声明的文件,它是接口:
interface NamedPerson {
firstName: string;
age?: number;
[propName: string]: any;
greet(lastName: string): void;
}
只要我保留[propName:string]的类型: any ,它就可以正常工作 . 如果我将其更改为 number 或其他任何内容,我会收到错误:
[ts]类型'(lastName:string)=> void'的属性'greet'不能分配给字符串索引类型'number' .
我想要一个使用NamedPerson接口的对象的新未指定属性只能是 number 类型,而不是其他任何东西 .
Question: What's wrong with the interface and how can I tailor it to my needs?
1 回答
它不需要是
any
类型,但它必须是包含 all 其他字段类型的类型 . 在你的情况下,这将是string
(由于firstName
),number
(由于age
)和(p: string) => void
(由于greet
)Typescript强制索引返回类型和已知字段之间的一致性(因为索引可用于返回任何已知字段) . 如果使用交集类型,则可以创建不一致的索引:
问题是您将无法直接创建此类对象,您只能使用
Object.assign
和一些类型断言创建它: