Vue.js 3:使用自定义类型验证道具类型

时间:2020-10-12 21:20:50

标签: typescript vue.js vue-component vuejs3

我正在使用Vue.js 3和Typescript开发单页应用程序。

该问题影响视图和单个文件组件。 People.vue从后端检索数据,并使用PersonRow.vue将其显示在多个v-for组件中。尽管数据属性类型已显式定义,但在浏览器控制台中仍收到警告:
[Vue warn]: Invalid prop: Type check failed for prop "person". Expected Person, got Object

一切正常,我可以将PersonRow.vue中的属性类型更改为Object以消除警告,但我希望类型检查正常工作。

People.vue

<template>
  <div class="container">
    <PersonRow v-for="person in people" :key="person.id" :person="person" />
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import { Person, getPeople } from '../services/person'
import PersonRow from '@/components/PersonRow.vue'

export default defineComponent({
  components: {
    PersonRow
  },
  data () {
    return {
      people: new Array<Person>()
    }
  },
  mounted () {
    getPeople().then(
      response => {
        this.people.push(...response)
      })
  }
})
</script>

PersonRow.vue

<template>
  <div class="row">
    <div class="col">{{ person.givenName }}</div>
    <div class="col">{{ person.familyName }}</div>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import { Person } from '../services/person'

export default defineComponent({
  props: {
    person: {
      type: Person,
      required: true
    }
  }
})
</script>

person.ts

export class Person {
  constructor (id: number, givenName: string, familyName: string) {
    this.id = id
    this.givenName = givenName
    this.familyName = familyName
  }

  id: number;
  givenName: string;
  familyName: string;
}

export async function getPeople (): Promise<Person[]> {
  const response = await fetch('https://api.example.com/people')
  return await response.json() as Person[]
}

2 个答案:

答案 0 :(得分:3)

Annotating Props

export default defineComponent({
  props: {
    person: {
      type: Object as PropType<Person>,
      required: true
    }
  }
})

深潜

是的,docs说:此外,type也可以是自定义构造函数,并且将通过instanceof校验来进行断言 < / p>

但是为了使其工作,必须使用new Person()构造函数来创建传递到prop的对象。问题是您的getPeople ()函数没有创建Person实例的数组-只是类型转换由json()Person[]创建的常规JS对象的数组。类型转换不会更改对象的运行时类型...

答案 1 :(得分:0)

“人”不是类型。类型可以是数组,对象,字符串,数字,布尔值,函数。因此,类型检查可以正常工作。