【发布时间】:2020-10-15 22:20:22
【问题描述】:
想象一下这个界面:
interface IUser {
id: string;
name: string;
age: number;
}
我们可以有这个功能:
const fetchUser1 = (userId: string): IUser => {
return {
id: userId,
name: 'John',
age: 32,
};
}
此函数无法返回不在 IUser 界面中的属性。
所以如果我们尝试返回一个新属性 city:
const fetchUser2 = (userId: string): IUser => {
return {
id: userId,
name: 'John',
age: 32,
city: 'Hollabrunn', // TS Error
};
}
我们得到 TS 错误:Object literal may only specify known properties, and 'city' does not exist in type 'IUser' where 绝对是我们想要的。
现在让我们尝试为这个函数创建一个类型。
type TFetchUser = (userId: string) => IUser;
并实现这个Type的一个函数,同样会误返回city属性。
const fetchUser3: TFetchUser = (userId) => {
return {
id: userId,
name: 'John',
age: 32,
city: 'Hollabrunn',
};
};
现在问题来了,我们没有任何 TS 错误。city 属性是允许的!
尽管如果我们将name 属性输入错误为fullName,我们会得到TS 错误Property 'name' is missing in type...。
谷歌搜索,我发现了一些关于接口这种奇怪行为的参考资料,但没有明确的解决方案。
你能帮忙吗?
【问题讨论】:
-
您应该提供playground。我确认这是不正确的打字稿行为
-
已添加游乐场链接
-
你说的不一致很奇怪是绝对正确的,但我相信你把它倒过来了:第一个实例是错误的,第二个是正确的。具有所需属性的对象确实实现了
IUser,即使它具有额外的属性。这样想,如果对象是一个类的实例,它使用“city”属性实现 IUser,它仍然是类型安全的。界面说“你必须至少做这么多才能符合”,而不是“你可以只做这三件事”。
标签: typescript function interface