起こった問題
Astroのコードブロック内でProps
という型を定義すると、そのファイル内で使う外部から渡される値を定義できます(ドキュメント)。
動的ルーティングで用いるgetStaticPaths
と組み合わせることも可能で、以下のように使えます。
type Props = InferGetStaticPropsType<typeof getStaticPaths>;
export async function getStaticPaths() {
...
return {
params: { slug: entry.id },
props: { entry, next, prev },
};
}
const { entry } = Astro.props;
ドキュメントにはこの定義を自動で検出して利用できると書かれていますが、このProps
の定義がVSCode上で反映されないということがありました。
解決法
もとのコードは、getStaticPaths
の定義を受けてProps
を定義することを意識して
export async function getStaticPaths() { ... }
type Props = InferGetStaticPropsType<typeof getStaticPaths>;
のように書いていました。
これを冒頭のコードのように、Props
の定義をgetStaticPaths
より上に持っていくと検出が機能しました。
はっきりと理由を分析したわけではありませんが、async/await
によりコードの流れが変化することが関係していると思われます。
別のコンポーネントでも、await
文を伴う関数呼び出しより前にProps
を定義するように変更したところ正しく認識されるようになりました。
await
は以降のコードをコールバックに包むので、Props
の定義をも包んでしまうのかもしれませn。
まとめ
Props
の定義がエディタ等に検出されない場合、定義をasync/await
の使用より先に持っていくと正しく検出される場合があるようです。