如何在没有 typescript 的情况下在 vue3 props 上使用 jsdoc?

sba*_*kht 3 jsdoc vue.js vuejs3 vue-composition-api

const props = defineProps({
items: {
    /** @type {{new(): Color[] }} */
    type: Array,
    required: true,
  },
  selectedColor: {
    type: Object,
    required: true,
  },
  composable: {
    type: Function,
    required: true
  }
})
Run Code Online (Sandbox Code Playgroud)

我们不使用打字稿,所以我尝试仅使用 jsdoc 和打字稿接口文件添加类型。

项目正确键入为颜色数组。如何将 selectedColor 的类型指定为 Color?另外,我如何指定可组合项的类型?

这些都不起作用

const props = defineProps({
  selected: {
    /** @type {Color} */
    type: Object,
    required: true,
  },
  composable: {
    /** @type {function(): number} */
    type: Function,
    required: true
  }
})
Run Code Online (Sandbox Code Playgroud)
const props = defineProps({
  selected: {
    /** @type {{ new(): Color}} */
    type: Object,
    required: true,
  },
  composable: {
    /** @type {{ new(): number}} */
    type: Function,
    required: true
  }
})
Run Code Online (Sandbox Code Playgroud)

sba*_*kht 5

我得到了一个可行的解决方案。

const props = defineProps({
  selectedColor: {
    /** @type import('vue').PropType<Color> */
    type: Object,
    required: true
  },
  setColor: {
    /** @type import('vue').PropType<(color: Color) => void> */
    type: Function,
    required: true,
  }
})
Run Code Online (Sandbox Code Playgroud)

在这种情况下,自动完成功能有效,但 VSC 抱怨 Function 类型。

Type 'FunctionConstructor' is not assignable to type 'PropType<(color: Color) => void>'.
  Type 'FunctionConstructor' is not assignable to type '() => (color: Color) => void'.ts(2322)
Run Code Online (Sandbox Code Playgroud)

用对象替换函数修复了错误,但道具不太具体。

const props = defineProps({
  setColor: {
    /** @type import('vue').PropType<(color: Color) => void> */
    type: Object,
    required: true,
  }
})
Run Code Online (Sandbox Code Playgroud)