2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IntrinsicAttributes をみたら冷静になってほしい

Last updated at Posted at 2024-12-04

はじめに

コンポーネントの props で型を指定することが出来ますが、VSCode でエラーを確認できました。IntrinsicAttributes ナニソレオイシイノなので防ぐ方法を記載します。

Type '{ skills: Skill[]; }' is not assignable to type 'IntrinsicAttributes & Skill[]'.
  Property 'skills' does not exist on type 'IntrinsicAttributes & Skill[]'.

ただし IntrinsicAttributes について詳しくは触れません :eyes:

エラーが起きたコード

UserSKillList コンポーネントを使って Card コンポーネントはスキルの一覧を表示します。skills は Skill 型の要素を持つ配列で Card コンポーネントからはUserSKillList コンポーネントに skills プロパティとして渡しています。

当時の実装イメージは

  • コンポーネントの引数 skills は Skill 型の要素を持つ配列
  • プロパティ skills はコンポーネントの引数と同じ名称の必要がある

です。ただし、このイメージは間違っています。

Card.tsx
<UserSkillList skills={ user.skills } />
UserSKillList.tsx
type Skill = {
  id: number;
  name: string;
};

export default function UserSkillList(skills: Skill[]) {
  const list = skills.map(skill =>
    <li key={skill.id}>{skill.name}</li>
  );
  return <ul>{list}</ul>;
}

コンポーネント名は XxxList とするのが通例のようですが、props までそれを守る必要があるのでしょうか?

正しいコード

プロパティはオブジェクト( = props)になるため、情報の取得は props.プロパティ が正しいです。props を毎回書く必要はないのでさらにプロパティを分割代入して、型の追加をします。

Card.tsx
<UserSkillList skills={ user.skills } />
UserSKillList.tsx
type Skill = {
  id: number;
  name: string;
};

export default function UserSkillList({ skills }: { skills: Skill[] }) {
  const userSkillList = skills.map(skill =>
    <li key={skill.id}>{skill.name}</li>
  );
  return <ul>{userSkillList}</ul>;
}

// または

export default function UserSkillList({ skills }: { skills: Skill[] }) {
  const userSkillList = skills.map(skill =>
    <li key={skill.id}>{skill.name}</li>
  );
  return <ul>{userSkillList}</ul>;
}

これでようやくコンポーネントが正しく動いたかと思います。

わかったこと

  • 分割代入でも型定義できる
  • プロパティで渡したデータを取得するには props.プロパティ になる

JISOUのメンバー募集中!

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてください!
▼▼▼

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?