简体   繁体   English

Typescript 属性在类型“{}”上不存在

[英]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>
  );
}

CodeSandBox 代码沙盒

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM