Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

styled-components を v6 にする #1349

Open
takurinton opened this issue Aug 2, 2023 · 14 comments
Open

styled-components を v6 にする #1349

takurinton opened this issue Aug 2, 2023 · 14 comments
Assignees
Labels
ガーデニング ガーデニングデーに対応する優先度の低いやつ

Comments

@takurinton
Copy link
Contributor

現状、型が export されてなかったりして上げられないので一旦待機。

関連

@takurinton takurinton added the ガーデニング ガーデニングデーに対応する優先度の低いやつ label Aug 2, 2023
@takurinton takurinton self-assigned this Aug 2, 2023
@takurinton
Copy link
Contributor Author

takurinton commented Aug 6, 2023

styled-components v6 になって ThemedStyledProps が export されなくなった。
https://github.com/voyagegroup/ingred-ui/blob/master/src/utils/spacer.ts#L1

これは ExecutionContext という型が export されてるので、それを使って再現可能。
ThemedStyledProps は型引数を2つ(マップしたい型と theme)受け取っていたが、ExecutionContext が theme の方はいい感じに当ててくれるのでマップしたい型だけ渡すようにした。

import { ExecutionContext } from "styled-components";

export type ThemedStyledProps<P> = P & ExecutionContext;

@takurinton
Copy link
Contributor Author

@takurinton
Copy link
Contributor Author

react-transition-group を使ってる箇所で、nodeRef を渡そうとするとエラーが出る。
nodeRef じゃなくて ref にしたら型エラーがなくなる。

予期された型は、型 'IntrinsicAttributes & PolymorphicComponentProps<"web", Substitute<(Pick<TimeoutProps<HTMLElement | undefined> & { classNames?: string | CSSTransitionClassNames | undefined; }, keyof TimeoutProps<...>> | Pick<...>) & RefAttributes<...>, CSSTransitionProps>, void, void, {}, {}>' に対してここで宣言されたプロパティ 'nodeRef' から取得されています

@takurinton
Copy link
Contributor Author

takurinton commented Aug 7, 2023

npx tsc の結果(一部抜粋)

Overload 1 of 2, '(props: PolymorphicComponentProps<"web", Substitute<(Pick<TimeoutProps<HTMLElement | undefined> & { classNames?: string | CSSTransitionClassNames | undefined; }, keyof TimeoutProps<...>> | Pick<...>) & RefAttributes<...>, CSSTransitionProps>, void, void, {}, {}>): Element', gave the following error.
Type 'RefObject' is not assignable to type 'Ref | undefined'.
Overload 2 of 2, '(props: Substitute<(Pick<TimeoutProps<HTMLElement | undefined> & { classNames?: string | CSSTransitionClassNames | undefined; }, keyof TimeoutProps<...>> | Pick<...>) & RefAttributes<...>, CSSTransitionProps>): ReactElement<...> | null', gave the following error.
Type 'RefObject' is not assignable to type 'Ref | undefined'.
16 nodeRef={nodeRef}

おそらくここらへんの話
styled-components/styled-components#4076

@takurinton
Copy link
Contributor Author

手元で型のテスト書いてみたら普通に通ってるしよくわからんかった

image

@takurinton
Copy link
Contributor Author

これは一旦こんな感じに書くと通るのでスルーでいいかな。
https://github.com/voyagegroup/ingred-ui/compare/styled-components-v6#diff-bfed18578c6277356dc2718fa9149b6477dc8d161f71db8348a6955e882cb907R6-R9

@takurinton
Copy link
Contributor Author

ちなみに nodeRef の定義は明示的に書かなくてもいい(書いておくけど)

@takurinton
Copy link
Contributor Author

spacing の部分でランタイムエラーを吐いた、dependabot の PR のときと同じだ
image

@takurinton
Copy link
Contributor Author

takurinton commented Aug 13, 2023

react-select のランタイムエラーはこれ
styled-components/styled-components#4074

以下のコンポーネントを styled-components で装飾して渡すと menuIsOpen が true の時にエラーになる

  • ValueContainer(ingred-ui に該当箇所なし)
  • Option(ingred-ui に該当なし)
  • MenuList

@takurinton
Copy link
Contributor Author

takurinton commented Aug 13, 2023

react-select 側で spacing が参照できない箇所が壊れてるっぽいけど、styled-components でどう扱ってるのかわからないのと、対応策がこちらにあるのか styled-components 自体にあるのかの判断が現状できてない(そもそも theme が壊れてるようにも見える)

@takurinton
Copy link
Contributor Author

react-select は外から注入したコンポーネントはここで上書きされるはずだけどされてなさそう?
https://github.com/JedWatson/react-select/blob/master/packages/react-select/src/components/index.ts#L141-L151

ingred-ui のケースだと、ここで MenuList が上書きされてくれないといけないのに、されないで react-select の MenuList が呼ばれてしまっているのでエラーになってるような雰囲気

@takurinton
Copy link
Contributor Author

react-select のエラーの件は styled-components v6.0.0-beta.1 以降で壊れてる
リリースノート: https://github.com/styled-components/styled-components/releases/tag/v6.0.0-beta.1

@takurinton
Copy link
Contributor Author

takurinton commented Aug 13, 2023

react-select は外から注入したコンポーネントはここで上書きされるはずだけどされてなさそう?

node_modules の下で print debug してみた感じ、そういうのではなさそうだった。
displayName: Styled(MenuList) になっていたし、JSX.Element ぽいものが格納されていた(react-select のデフォルトだったら [function MenuList] とかになるはず)

@takurinton
Copy link
Contributor Author

ひとまず現在地のメモを書いた。react-select の問題が解決したら v6 に上げてもいいかもなー(PR は作ったのでマージされれば対応できそう)
https://memo.takur.in/tech/frontend/styled-components-v6.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ガーデニング ガーデニングデーに対応する優先度の低いやつ
Projects
None yet
Development

No branches or pull requests

1 participant