検索

ホームページ  >  に質問  >  本文

Vue3 と TypeScript を使用して Ponia ストアを Prop として渡します

<p>Typescript、Ponia、Vue3 を使用しており、<code>MenuButton</code> コンポーネントがあり、メニューを開いている状態と表示するアクションに対して Ponia のストレージ/非表示を渡すことができるようにしたいと考えています。 。アプリケーションにはいくつかの異なるメニューがあるため、それらを渡して、すべて同じファクトリーを使用してストアを定義できるようにしたいと考えています。これらすべてを typescript で動作させる方法を見つけようとしています。 </p> <pre class="lang-js prettyprint-override"><code>// nav.store.ts import {defineStore} から "pinia"; import { useStorage } から "@vueuse/core"; タイプ { RemovableRef } を "@vueuse/core" からインポートします。 エクスポートインターフェイス MenuStore { isOpen: RemovableRef<boolean>, トグル(力?: ブール値) : void, open(): 無効、 close(): 無効、 } インターフェイスの状態 { isOpen: RemovableRef<boolean>; } 関数 menuStoreFactory(id: 文字列) { returndefineStore(id, { 状態: () : 状態 => ({ isOpen: useStorage(`${id}-open`, false), })、 行動: { トグル(力?: ブール値) { this.isOpen = 強制 != 未定義 ? 強​​制 : !this.isOpen; }、 開ける() { this.isOpen = true; }、 近い() { this.isOpen = false; } } }); } エクスポート const useMainMenuStore = menuStoreFactory('mainMenu'); import const useMobileMenuStore = menuStoreFactory('mobileMenu'); </code></pre> <pre class="lang-js prettyprint-override"><code>// メニュー ボタン コンポーネントのセットアップ スクリプト import { MenuIcon, MenuLeftIcon } from "@/icons"; import type { MenuStore } from "@/modules/nav/nav.store"; インターフェイスの小道具 { コントローラ: メニューストア } const props =defineProps<Props>(); </code></pre> <p>使用方法は非常に簡単です。</p> <pre class="lang-html prettyprint-override"><コード><テンプレート> <メニューボタン :controller="メインメニュー" ></メニューボタン> </テンプレート> <スクリプト設定 lang=ts"> const mainMenu = useMainMenuStore(); </スクリプト> </code></pre> <p>現在のインターフェースでは、プロパティの不一致エラーが発生します。いくつかの調査の後、インターフェイスを次のように変更し、使用上のエラーを修正しましたが、<code>MenuButton</code> コンポーネントで <code>toggle()</code> と < をスローしました。 code>isOpen< の /code> は解決されていません。</p> <pre class="lang-js prettyprint-override"><code>エクスポート インターフェイス MenuStore extends PoniaCustomStateProperties<{ isOpen: RemovableRef<boolean>, トグル(力?: ブール値) : void, open(): 無効、 close(): 無効、 }>> {} </code></pre> <p>もう一つの接近の説明は次のとおりです:</p> <pre class="lang-js prettyprint-override"><code>エクスポート インターフェイス MenuStore extends Store<string, { isOpen: RemovableRef<boolean>, トグル(力?: ブール値) : void, open(): 無効、 close(): 無効、 }>> {} </code></pre> <p>これにより、使用時にこのような問題が発生しますが、コンポーネントには問題はありません</p> <pre class="brush:php;toolbar:false;">Type _StoreWithState<string, State, {}, {toggle(force?: boolean): void, close(): void, open(): void} > & UnwrapRef<State> & _StoreWithGetters<{}> & {toggle(force?: boolean): void, close(): void, open(): void} & PoniaCustomProperties<string, State, {}, {toggle(force?: boolean): void, close(): void, open(): void}> & PoniaCustomStateProperties<State>は、MenuStore タイプに割り当てることはできません ... PoniaCustomStateProperties<State> と入力します。タイプ MenuStore</pre></p> には割り当てられません。
P粉899950720P粉899950720448日前651

全員に返信(1)返信します

  • P粉187677012

    P粉1876770122023-08-26 14:00:15

    あなたの質問は主に必要な型/インターフェイスに関するもののようですので、それに答えます。

    型を自分で記述する代わりに、返された格納された型を単純に使用できます。

    defineStore の戻り値を返すファクトリ関数があります。これ自体がストアを返す関数です。したがって、typeof を使用してファクトリ関数の型を取得し、TypeScript の ReturnType ヘルパーを使用して戻り値の型をドリルダウンして、格納されている型を見つけることができます。

    次のものが必要です:

    リーリー

    セグメンテーション:

    リーリー
    • A: ファクトリ関数のタイプを取得します。
    • B: ファクトリ関数の戻り値の型、つまり defineStore の戻り値を取得します。これ自体はストレージを返す関数です。
    • C: この関数の戻り値の型を取得します。お店自体もそういうタイプです。

    返事
    0
  • キャンセル返事