使用 composition api 和 typescript 类型系统强类型化 vue 组件的 props

Strongly typing props of vue components using composition api and typescript typing system

我正在使用 vue 组合 api 和打字稿。

如何使用打字稿打字系统强打组件属性?

如官方所述docs您可以通过两种方式输入道具:

通过参数注释定义 arops

import { defineComponent } from 'vue'

export default defineComponent((props: { foo: string }) => {
  props.foo
})

或者像这样

import { defineComponent } from 'vue'

export default defineComponent({
  props: {
    foo: String
  },
  setup(props) {
    props.foo // <- type: string
  }
})

Troy Kessier 的回答并不完全准确。我引用 the documentation on definecomponent:

Alternatively if your component does not use any option other than setup itself, you can pass the function directly […]

所以没有两种声明属性的方式,而是两种声明组件的方式,并且每种方式都提供了自己的输入 props 的方式。

使用经典方式和 TypeScript,使用 PropType:

import { defineComponent, PropType } from 'vue'

export default defineComponent({
  props: {
    someOptionalString: String,

    someRequiredString: {
      type: String,
      required: true
    },

    someObject: {
      type: Object as PropType<MyObjectType>,
      required: true
    },
  },

  // …
})

注意:PropType 有助于为 setup 函数中的 props 参数提供正确的 TypeScript 类型。但是 props 的底层 Vue 类型仍然是 Object,目前没有办法为父组件传递的这些 props 强制执行更好的类型。