vue.js - Vue + TypeScript: hvordan annotere computed med typer?
Jeg har følgende Vue-kode:
const chosenWallet = computed({
get() {
return return wallet.value ? wallet.value!.name : null;
},
set(newVal: WalletName) {}
}
Som kaster følgende feil:
TS2769: No overload matches this call.
Overload 1 of 2, '(getter: ComputedGetter<unknown>, debugOptions?: DebuggerOptions | undefined): ComputedRef<unknown>', gave the following error.
Argument of type '{ get(): WalletName | null; set(newVal: WalletName): void; }' is not assignable to parameter of type 'ComputedGetter<unknown>'.
Object literal may only specify known properties, and 'get' does not exist in type 'ComputedGetter<unknown>'.
Overload 2 of 2, '(options: WritableComputedOptions<WalletName>, debugOptions?: DebuggerOptions | undefined): WritableComputedRef<WalletName>', gave the following error.
Type '() => WalletName | null' is not assignable to type 'ComputedGetter<WalletName>'.
Type 'WalletName | null' is not assignable to type 'WalletName'.
Type 'null' is not assignable to type 'WalletName'.
44 | const { wallet, setWallet } = useWallet();
45 | const chosenWallet = computed({
> 46 | get() {
| ^^^
47 | return wallet.value ? wallet.value!.name : null;
48 | },
49 | set(newVal: WalletName) {
Jeg forstår det ikke helt, men min magefølelse er at Vues computed()-verdi tror at returverdien bare burde være WalletName, men selvfølgelig returnerer getteren WalletName | null.
Jeg prøvde å sette typer overalt, men feilen forsvinner ikke. Hvordan fikser jeg det?
Svar #1
Getteren for computed får sin type utledet fra argumentet til setteren, som er WalletName. Returntypen til getteren forventes å samsvare, men den betingede returnen gjør typen WalletName | null (forskjellig fra argumentet til setteren), noe som fører til feilen du observerte.
Løsning
Enten gjør setterens argument WalletName | null:
const chosenWallet = computed({
get() {
return wallet.value ? wallet.value.name : null
}, 👇
set(newVal: WalletName | null) {}
})
Eller få getterens returverdi til å samsvare med setterens argumenttype:
const chosenWallet = computed({
get() { 👇
return (wallet.value ? wallet.value.name : null) as WalletName
},
set(newVal: WalletName) {}
})
Svar #2
Prøvde du?
const chosenWallet: WalletName | null = computed({
get(): WalletName | null {
return return wallet.value ? wallet.value!.name : null;
},
set(newVal: WalletName) {}
}
