javascript 如何在react typescript中输入 prop ?[关闭]

ffscu2ro  于 2023-04-28  发布在  Java
关注(0)|答案(4)|浏览(134)

**关闭。**这个问题是not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
如何在react typescript中输入 prop ?我收到错误属性'authors' does not exist on type '[Props] & { children?:ReactNode;}'. ts。我希望传递一个由名称和密码密钥组成的数组。
https://codesandbox.io/s/test-login-page-tasks-24-04-forked-eg91s5?file=/src/components/Login.tsx:229-274

type Props = {
  authors: {
    name: string;
    password: string;
  }[];
};

const Login: FC<[Props]> = ({ authors }) => {
  return (
  ...
  )
}

虽然我在传递 prop 。

wqsoz72f

wqsoz72f1#

尝试将[Props]更改为Props,如下所示

const Login: FC<Props> = ({ authors }) => { ... }

现在它可以工作了,因为它期望的是对象而不是数组,我们将传递一个像<Login authors={authors} />这样的对象。现在authors将是一个对象数组。

a5g8bdjr

a5g8bdjr2#

你可以使用typeinterface来描述 prop 。通常用interface来描述objectsinterfaces以字母I开始,typesT开始,这也是一个很好的约定。

interface IAuthor {
  name: string;
  password: string;
}

const Login = ({ authors }: { authors: IAuthor[] ): JSX.Element => {
  return (
    ...
  )
}

在上面的示例中,Login组件期望一个prop authors,它是IAuthor e描述的objects数组。g的。

authors = [
  {
    name: "Spiderman"
    password: "maryjane"
  },
  { 
    name: "Superman"
    password: "loislane"
  }
]

希望这能帮上忙。

gab6jxml

gab6jxml3#

type Props = {
          authors: {
            name: string;
            password: string;
          }[];
        };
        
        const Login: FC<Props> = ({ authors }) => {
          const history = useHistory();
          const [name, setName] = useState<IUser["name"]>("");
          const [password, setPassword] = useState<IUser["password"]>("");
    
    
    please use these syntaxes to fix the error. There are three errors in your code that I found.

FC<Props>
<IUser["name"]>
<IUser["password"]>
k4emjkb1

k4emjkb14#

您定义了IUser接口并定义了名称、密码状态以及IUser类型,这将导致问题,因为当您定义以下内容时:

const [name, setName] = useState<IUser>("");
// name will expected to be 
name = {
    name: 'name',
    password: 'password'
}

这是错误的,因为name,password是一个字符串,所以试着这样定义它:

const [name, setName] = useState<IUser["name"]>("");
const [password, setPassword] = useState<IUser["password"]>("");

然后你必须修复向FC组件传递作者的问题:

const Login: FC<Props> // instead of <[Props]>

最后一件事,你必须修复这个类型,以匹配你从应用程序传递给它的数据类型。tsx:

type Props = {
    authors: {
       author_name: string; // instead of name
       password: string;
    }[];
};

// because you are passing and comparing here with author_name not with name

const userData = authors.find(
  (user) => user.author_name === name && user.password === password
);

然后你从应用程序中传递它,就像这样:

const Authors = [
   {
      id: "001",
      author_name: "John Smith", // not a name
      password: "123"
   }
 ];

相关问题