2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Type '(value: number) => [string, string]' is not assignable to type 'Formatter<ValueType, NameType>'

2
Posted at

はじめに

個人開発で水泳の練習記録アプリ「Suimote」をリリースしました!
rechartsの Tooltip コンポーネントで formatter を指定したら、TypeScriptのビルドが通らなくなりました。


問題

<Tooltip
  formatter={(value: number) => [`${value} 日`, "練習日数"]}
/>

以下のエラーが出ます。

Type '(value: number) => [string, string]' is not assignable to type 'Formatter<ValueType, NameType>'
  Types of parameters 'value' and 'value' are incompatible.
    Type 'ValueType | undefined' is not assignable to type 'number'.
      Type 'undefined' is not assignable to type 'number'.

原因

rechartsの Formatter 型の定義を見ると、value の型は TValue | undefined です。

// recharts/types/component/DefaultTooltipContent.d.ts
export type Formatter<TValue, TName> = (
  value: TValue | undefined,
  name: TName | undefined,
  ...
) => [React.ReactNode, TName] | React.ReactNode;

value: number と書くと、ValueType | undefinednumber に渡そうとして型が合いません。undefined が来る可能性があるためです。


解決方法

型アノテーションを外して推論に任せ、??undefined に対応します。

<Tooltip
  formatter={(value) => [`${value ?? 0} 日`, "練習日数"]}
/>
修正前 修正後
(value: number) (value)
${value} ${value ?? 0}

value の型を明示しないことで、rechartsが定義した ValueType | undefined がそのまま推論されます。?? 0undefined の場合のフォールバックを入れておけば安全です。


おわりに

ライブラリのコールバック関数で型エラーが出たときは、自分で型を書くより推論に任せた方がうまくいくことが多いです。エラーメッセージの Type 'X' is not assignable to type 'Y' が出たら、まず型アノテーションを外してみるのが近道です

この記事が参考になれば幸いです!

2
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?