Vue 3 + TypeScript + <script setup> 中的完整 props 声明(带有默认值和验证器)

Igo*_*rov 6 validation typescript vuejs3

下面是现代 Vue 3 props 声明的基本示例,其中<script setup lang="ts">包含强制name和可选age

// <script setup lang="ts">
defineProps<{
  name: string,
  age?: number
}>()
// </script>
Run Code Online (Sandbox Code Playgroud)

这是相同的声明,但具有age默认值:

// <script setup lang="ts">
withDefaults(defineProps<{
  name: string,
  age?: number
}>(), {
  age: 20
})
// </script>
Run Code Online (Sandbox Code Playgroud)

我的主要问题是:有没有办法将验证器合并到这个新语法中?或者每当我需要添加验证器时,我需要回滚到旧语法,即:

// <script setup lang="ts">
defineProps({
  age: {
    type: Number,
    validator(value: number) => value > 0
  }
})
// </script>
Run Code Online (Sandbox Code Playgroud)

我发现了类似的主题,其中一些人建议使用泛型类型并传递参数来定义属性,如下所示:

// <script setup lang="ts">
defineProps<{
  age: number
}>({
  age: {
    validator(value: number) => value > 0
  }
})
// </script>
Run Code Online (Sandbox Code Playgroud)

但这种方法不起作用并立即出现错误:( defineProps has both a type-only props and an argument.eslintvue /valid-define-props )