Vue 3脚本设置属性确认 typescript

ghhaqwfi  于 2023-01-27  发布在  TypeScript
关注(0)|答案(6)|浏览(156)

我正在尝试用Vue3脚本设置语法替换我的Vue2选项API属性对象代码。
现有:

type: {
  type: String,
  default: 'button',
  validator: (prop) => ['button', 'submit', 'reset'].includes(prop)
}

目前为止我有这个

<script lang="ts" setup>
interface Props {
  type?: string;
}

const props = withDefaults(defineProps<Props>(), { type: 'button' });
</script>

但是我找不到任何关于如何在脚本设置语法中处理prop验证器的信息

trnvg8h3

trnvg8h31#

您可以在defineProps中使用与Options API相同的结构。(DOCS)

<script lang="ts" setup>
  type Type = 'button' | 'submit' | 'reset';

  interface Props {
    type: Type;
  }

  const props = defineProps<Props>({ 
    type: {
      type: String,
      default: 'button',
      validator: (prop: Type) => ['button', 'submit', 'reset'].includes(prop)
    }
  });
</script>
lsmepo6l

lsmepo6l2#

我相信我已经解决了这个问题,虽然我对typescript还是个新手,但这应该是等效的(将在typescript而不是vue runtime中验证)

interface Props {
  type?: 'button' | 'submit' | 'reset';
}
2ul0zpep

2ul0zpep3#

跟进@Titan的回答,我喜欢用一种可以直接访问脚本中的 prop 的方式来写它。

<script setup lang="ts">
type Type = 'button' | 'submit' | 'reset';

const { type } = withDefaults(defineProps<{
  type?: Type
}>(),{
  type: 'button'
})
//As it is already deconstructed, you can use it as `type` instead of `props.type`
</script>

尽管我建议将prop名称从type更改为其他名称,因为typescript可能会误解实际类型声明的prop名称。

lp0sw83n

lp0sw83n4#

对于那些也来自谷歌,因为Vue文档不是很清楚这一点,你可以做一个直接转换使用Vue 2风格选项格式以及:

const props = defineProps({
  type: {
    type: String,
    default: 'button',
    validator: (prop) => ['button', 'submit', 'reset'].includes(prop)
  }
})
k4ymrczo

k4ymrczo5#

最后我用这个结尾🤷‍♂️

<script lang="ts" setup>
  import type { PropType } from 'vue';
  export type Type = 'button' | 'submit' | 'reset';

  export interface Props {
    type: Type;
  }

  defineProps({ 
    type: {
      type: String as PropType<Type>,
      default: 'button',
      validator: (prop: Type) => ['button', 'submit', 'reset'].includes(prop)
    }
  });
</script>
0h4hbjxa

0h4hbjxa6#

您可以这样做以避免重复的值。

<script lang="ts" setup>
const types = ['button' | 'submit' | 'reset'] as const
export type Type = typeof types[number]

const props = defineProps<Props>({ 
  type: {
    type: String as PropType<Type>,
    default: 'button',
    validator: (prop: Type) => types.includes(prop)
  });
</script>

相关问题