vue.js - Vue 2/Typescript, cum să transformi un prop inline?


Am un proiect Vue 2 NuxtJS configurat cu Typescript și aș dori să profit de cuvântul cheie unknown în Typescript.

În componenta mea, primesc o proprietate declarată astfel

props: { 
  items: {
    type: Array as () => LabelValuePair[],
    required: true,
  },
},

LabelValuePair este declarat aici

interface LabelValuePair {
  label: string;
  value: unknown;
}

Și în interiorul șablonului meu, aș dori să folosesc ceva de genul acesta

<li v-for="item in items" :key="item.value as string">
  <span>
    {{ item.label }}: <strong>{{ item.value }}</strong>
  </span>
</li>

Problema este că, la fel ca operatorul ternar, cuvântul cheie as din Typescript nu este recunoscut ca sintaxă validă de către compilatorul Vue.

Există o soluție sau măcar o cale de ocoli pentru a evita să faci ceva prostesc, ca în exemplul următor?

setup(props) {
  const castItems = props.items.map((item) => ({
    ...item,
    value: item.value as string,
  }));

  return { castItems };
},

Răspuns #1

Dacă LabelValuePair urmează să fie reutilizat și se așteaptă să aibă o valoare string într-o proprietate, acesta este cazul pentru tipul generic:

interface LabelValuePair<T = unknown> {
  label: string;
  value: T;
}

și

  items: {
    type: Array as PropType<LabelValuePair<string>[]>,
    required: true,
  },