LoginSignup
9
5

More than 3 years have passed since last update.

TypeScript + React SFCでmapを使うとJSX element type 'Element | Element[]' is not a constructor function for JSX elements.になった話

Posted at

はじめに

詳細についてはGitHubのIssueみた方が早いです
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20356
https://github.com/edorivai/ts-sfc-array

ざっくり

  • SFCでmapをreturnするとTypeScriptでエラーがでる
  • Fragmentでarrayにしなければ解決する
  • Class Componentにしても解決する

現象

const Lines = () => {
  return [1,2,3].map((id, key) => <li key={key}>{id}</li>)
}

export default () => (
  <ul>
    <Lines />
  </ul>
)

これがエラーになる。

TypeScript error in /Users/develop/dashboard/src/LineItems.tsx(69,9):
JSX element type 'Element | Element[]' is not a constructor function for JSX elements.
  Type 'Element[]' is not assignable to type 'Element'.  TS2605

  > 69 |         <Lines />
       |         ^
    70 |       </ul>

対応1: 配列を返さないようにする

全部ちゃんと読んだわけではないのですが、Listになっているのが問題な様子なので、配列じゃない形にすれば回避できます。

export default () => (
  <ul>
    {[1,2,3].map((id, key) => <li key={key}>{id}</li>)}
  </ul>
)

まとめれない場合は、<><Fragment>を使うとよいでしょう。

対応2: SFCをやめる

とはいえTable系のマークアップだったりするとうまくまとめれないこともあります。
そういうときは、昔ながらのClassを使う形でも回避できます。

class Lines extends React.Component {
  render() {
    return [1,2,3].map((id, key) => <li key={key}>{id}</li>)
  }
}

export default () => (
  <ul>
    <Lines />
  </ul>
)
9
5
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
9
5