[英]Typescript property does not exist on type '{}'
I have type User
that can be empty object or object with required fields.我的User
类型可以是空的 object 或 object 和必填字段。 In function getFirstName
I check if object is not empty and then return one of the fields.在 function getFirstName
中,我检查 object 是否不为空,然后返回其中一个字段。 Then I have error: "Property 'firstName' does not exist on type '{}'".然后我有错误:“类型'{}'上不存在属性'firstName'”。 Why does it work so?为什么会这样?
type User =
| {
firstName: string;
age: number;
}
| {};
const getFirstName = (currentUser: User) => {
if (!Object.keys(currentUser).length) {
return "_";
}
return currentUser.firstName; //Property 'firstName' does not exist on type '{}'
};
export default function App() {
const user: User = {
firstName: "Bob",
age: 14
};
const emptyUser = {};
return (
<div className="App">
<h1>Hello {getFirstName(user)}</h1>
<h1>Hello {getFirstName(emptyUser)}</h1>
</div>
);
}
1.suggest Object.keys(currentUser).length <= 0
instead of .Object.keys(currentUser).length
1.建议Object.keys(currentUser).length <= 0
代替.Object.keys(currentUser).length
2.you need to down cast the union type because property firstName does not exist across multiple type of the union type 2.你需要向下转换联合类型,因为在联合类型的多个类型中不存在属性 firstName
type User =
| {
firstName: string;
age: number;
}
| {};
const getFirstName = (currentUser: User) => {
if (Object.keys(currentUser).length <= 0) {
return "_";
}
return (currentUser as {
firstName: string;
age: number;
}).firstName;
};
export default function App() {
const user: User = {
firstName: "Bob",
age: 14
};
const emptyUser = {};
return (
<div className="App">
<h1>Hello {getFirstName(user)}</h1>
<h1>Hello {getFirstName(emptyUser)}</h1>
</div>
);
}
A better approach is to remove the empty object from the User type (this way you take full advantage of typescript's type checking) and when you encounter an empty object that you know is a User type then just cast it with the as
keyword.更好的方法是从 User 类型中删除空的 object (这样你就可以充分利用 typescript 的类型检查),当你遇到一个你知道是 User 类型的空 object 时,只需使用as
关键字进行转换。
type User = {
firstName: string;
age: number;
};
const getFirstName = (currentUser: User) => {
if (!Object.keys(currentUser).length) {
return "_";
}
return currentUser.firstName;
};
export default function App() {
const user: User = {
firstName: "Bob",
age: 14
};
const emptyUser = {};
return (
<div className="App">
<h1>Hello {getFirstName(user)}</h1>
<h1>Hello {getFirstName(emptyUser as User)}</h1>
</div>
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.