TypeScriptでstyled-componentsの"as" propにNextLinkコンポーネントを渡したい時
7011 ワード
実装したかったこと
<label>
要素において、リンク付きにしたい箇所とリンクなしにしたい箇所があったため、以下のように2通りのケースに対応できるようにしたい。
-
<label>
をベースにスタイルを定義する。 -
<label>
を<a>
に置き換えて、スタイルは全く同じものを使用する。
やったこと
"as"
prop を使用し解決しようとしました。
export const CategoryLink: React.FunctionComponent<LinkProps> = ({
title = 'メンヘラ',
href,
}) => (
<CategoryLabel as={Link} href={href}>
{title}
</CategoryLabel>
);
これでいけると思いました。怒られました
Types of property 'as' are incompatible.
Type 'typeof Link' is not assignable to type 'string | UrlObject | undefined'.
Type 'typeof Link' has no properties in common with type 'UrlObject'.
これは、
-
"as"
の型が間違ってるよ。 -
Link
の型は ("as"
で要求されている)string | UrlObject | undefined
のどれにも該当しないよ。 -
Link
の型は (唯一オブジェクトとして検査する価値のある)UrlObject
のプロパティと構成が全く違うよ。
と言われました。とりあえずエラーをもとに、styled-componet ts as link
のワードでググりました。すると同じようなことで悩んでるZeit公式のissueにぶつかりました。
こうしたらいけると公式が言うからいけるのでしょう!やってみます。
export const CategoryLink: React.FunctionComponent<LinkProps> = ({
title = 'メンヘラ',
href,
}) => (
<Link href={href} passHref>
<CategoryLabel as="a">
{title}
</CategoryLabel>
</Link>
);
できました!!!!!!!!
(レイアウトは今作り段階なのでゴミです許してください)
何がダメだったのか?
こちらはNext.jsの公式 Routingのところから抜粋したものです。
- Next.jsのRoutingで設定してる
as
とstyled-componentで設定しようとしたas
が被っていた。 - Next.jsのRoutingの
as
をTypeScript側は参照しようとしているのに、私がstyled-componentのas
を提示した。
このため
Link
の型は (唯一オブジェクトとして検査する価値のある)UrlObject
のプロパティと構成が全く違うよ。
と言うエラーになったと言うわけです。
ちなみに
現時点でわかったas
が受け取れるものは以下です。
- HTMLのネイティブ要素名(文字列)
- styled-componentで作ったコンポーネント(オブジェクト)
なので下のコードも通ります。
export default CategoryLabel;
const Foo = styled.h1`
`;
export const CategoryLink: React.FunctionComponent<LinkProps> = ({
title = 'メンヘラ',
href,
}) => (
<CategoryLabel as={Foo}>
{title}
</CategoryLabel>
);
以上です!
メンヘラなので、何か助言あれば優しい言葉でお願いします。
Author And Source
この問題について(TypeScriptでstyled-componentsの"as" propにNextLinkコンポーネントを渡したい時), 我々は、より多くの情報をここで見つけました https://qiita.com/macololidoll/items/5fca89aad56fca35c9ff著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .