重寫後的標題為:VueJS Typescript v-model 類型 'number' 無法指派給型別 'Nullable<string>'
<p>所以我對 Typescript 和 VueJS 及其所有新功能都很陌生。 </p><p>
一切都按預期工作,但我無法擺脫打字稿錯誤並同時使用 v-model。 </p><p>
我正在開發一個網頁視圖,供成員檢查和更改其屬性。我從 API 獲取會員資料並將其儲存在 PiniaStore 中。這意味著我有幾個需要成員的數字和字串的輸入欄位。 AFAIK v-model 是輸入欄位的最佳選擇。 </p>
<pre class="brush:bash;toolbar:false;"> Type 'string | number | null | undefined' is not assignable to type 'Nullable<string>'.
Type 'number' is not assignable to type 'Nullable<string>'.
</pre>
<p>所有關於此錯誤的 stackoverflow 問題的建議解決方案(例如這個或這個)都不適合我的問題。我發現了一個不好的解決方法,我不喜歡在模板區塊中使用更改事件而不是v-model,並且在我的腳本中出現相同的錯誤,但透過<code>//@ts-ignore< /code> 忽略它。 </p>
<p>首先,我真正要求的是如何註解掉 VueJs 範本區塊中的打字稿錯誤,這裡已經問過了。 </p><p>
其次,如何解決這個問題而不出現打字稿錯誤? </p>
<p>查看下面的程式碼,我在 <code>v-model</code> 處出現此錯誤,並且不知道如何修復它:</p>
<pre class="brush:bash;toolbar:false;"><script setup lang="ts">
import { useMembershipStore } from "@/stores/membership";
const membershipStore = useMembershipStore();
membershipStore.getMembership();
const { membership } = storeToRefs(membershipStore);
function save() {
if (membership.value) {
membershipStore.updateMembership(membership.value);
}
}
</script>
<template>
<div v-if="membership === null" class="loading">
<h2>Loading</h2>
</div>
<div v-else class="members-table">
<div v-for="(value, key) in Object.keys(membership)" >
<br />
<InputText type="text"
v-model="membership[value as keyof typeof membership]"
/>
</div>
<Button @click="save()" />
</div>
</template>
</pre>
<p>這是我的型別定義:
<strong>membershipstore.ts</strong></p>
<pre class="brush:bash;toolbar:false;">export type MembershipStoreState = {
membership: Member | null;
};
</pre>
<p><strong>類型.ts</strong></p>
<pre class="brush:bash;toolbar:false;">export interface Member {
id?: number;
user_id?: string;
user_attr: string | null;
create_attr?: string | null;
admin_attr?: string | null;
}
</pre>
<p>我還弄清楚了 <code>Nullable<string></code> 類型的來源。它來自其元件InputText的PrimeVues類型定義,可以在這裡找到:</p>
<pre class="brush:bash;toolbar:false;">export interface InputTextProps extends InputHTMLAttributes {
/*** 組件的值。*/
modelValue?: Nullable<string>;
}
</pre>
<p>完整的程式碼範例可以在這裡找到</p><p>
使用更改事件的完整程式碼範例,其中包含錯誤的解決方法</p>