vue.js - TypeScript hovorí, že typ vlastnosti je neznámy, napriek tomu, že som sa pokúsil definovať svoje vlastnosti prísne
Som nováčik vo Vue a ešte novší v TypeScripte. Preskúmal som dokumentácie pre obe a vytvoril som s nimi malé, malé projekty. Avšak prechod na kompozíciu s Vue a TS sa ukazuje ako náročný.
Chcem mať 3 tlačidlá na reorganizáciu poradia niektorých úloh v zozname podľa tutoriálu od Net Ninjy. Napriek tomu, že som jeho kód skopíroval, TS mi v IDE dáva chyby. Následne (pravdepodobne ide o problém vyplývajúci z chýb zobrazovaných v IDE) je tam množstvo kódu, ku ktorému sa nedostáva. Dovoľ mi ti to ukázať.
<script lang="ts">
import { computed, defineComponent, PropType } from "vue";
import Job from "../types/Job";
import OrderTerm from "../types/OrderTerm";
export default defineComponent({
props: {
jobs: {
required: true,
type: Array as PropType<Job[]>,
},
order: {
required: true,
type: String as PropType<OrderTerm>,
},
},
setup(props) {
console.log("ce code est allerant", props, props.jobs);
const aaa = props;
const x = computed(() => {
console.log(
"this code was not reached; restated, it does not print, idk why"
);
return [...props.jobs].sort((a: Job, b: Job) => {
return a[props.order] > b[props.order] ? 1 : -1;
});
});
// console.log("fobar");
return { x };
},
});
</script>
V IDE sa mi zobrazuje táto chyba:
ype 'unknown' must have a '[Symbol.iterator]()' method that returns an iterator.Vetur(2488)
(parameter) props: Readonly<LooseRequired<Readonly<{
jobs: unknown;
order: unknown;
} & {}>>>
&
Type 'unknown' cannot be used as an index type.Vetur(2538)
(parameter) props: Readonly<LooseRequired<Readonly<{
jobs: unknown;
order: unknown;
} & {}>>>
Nevidím, ako by časti jobs & order mohli byť nesprávne definované. Čo by tam mohlo byť zlé? Vyzerá to presne tak, ako je to v Ninja kóde, takže... Som zmätený. Chyby sú úplným protikladom mojich očakávaní, ktorými sú, že vlastnosti, ktoré odovzdávam, sú TS detekované. Sú správne.
Tu sú obsah props.jobs pred riadkom computed():
Proxy { <target>: (4) […], <handler>: {…} }
<target>: Array(4) [ {…}, {…}, {…}, … ]
0: Object { title: "bartender", location: "vancouver", salary: 35, … }
1: Object { title: "priest", location: "Calgary", salary: 90, … }
2: Object { title: "Farmworker", location: "Hyrule", salary: 40000, … }
3: Object { title: "potus", location: "USA", salary: 999999, … }
length: 4
Ak chýba nejaký užitočný kontext, dajte mi prosím vedieť.
úprava: horúco na stope, zmenil som to na computed((props) => ... a teraz mám lepšiu chybu
TS7053: Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 'Job'.
42 | console.log("asdfsaf");
43 | return [...props.jobs].sort((a: Job, b: Job) => {
> 44 | return a[props.order] > b[props.order] ? 1 : -1;
| ^^^^^^^^^^^^^^
45 | });
46 | });
upraviť a pridať moju šablónu bez lorem ipsum:
<template>
<div class="jobList">
<h1>Ordered by: {{ order }}</h1>
<ul>
<li v-for="job in x" :key="job.id">
<div class="card">
<div>{{ job.id }}</div>
<h2>{{ job.title }} in the city of {{ job.location }}</h2>
<p>{{ job.salary }} rupees</p>
<div class="description">
lorem ipsum but shorter
</div>
</div>
</li>
</ul>
</div>
</template>
Zobrazenie ../types/Job a ../types/OrderTerm:
// Job.ts
interface Job {
title: string,
location: string,
salary: number,
id: string,
ft: boolean
}
export default Job
// OrderTerm.ts
type OrderTerm = "location" | "title" | "salary"
export default OrderTerm
Odpoveď č. 1
musíte definovať pole ako pole úloh:
const jobs = [...props.jobs] as Job[]
