javascript - Vue 3 defineEmits 打破了 defineProps 类型

我正在使用 Vue 3 和 TS 4.4。我有一个组件,它使用 defineProps 定义其 prop 类型。当我添加对 defineEmits 的调用时,VS Code 开始告诉我组件模板中不存在我的 props 变量。这是源代码:

<script setup lang="ts">
import { defineProps, defineEmits, VueElement, defineComponent } from "vue";

const emit = defineEmits<{
  "update:checked": boolean;
}>();

const props = defineProps<{
  label?: VueElement | string;
  checked?: boolean;
}>();
</script>

<template>
  <label>
    <input
      type="checkbox"
      :checked="props.checked"
      @change="(event) => emit('update:checked', (event.target as any)?.checked)"
    />
    {{ props.label }}
  </label>
</template>

还有一些屏幕截图可以更好地展示我在 VS Code 中看到的内容。这是在添加 defineEmits 之后:

这是没有 defineEmits 的:

定义 props 和 emitts 类型的正确方法是什么?

最佳答案

defineEmits<T>() generic argument本质上是一个仅定义函数的TypeScript接口(interface),它接收特定的事件名称和可选参数:

interface Emits {
  (e: __EVENT1_NAME__ [, arg1: __ARG1_TYPE__ [, arg2: __ARG2_TYPE__]]...): void
  (e: __EVENT2_NAME__ [, arg1: __ARG1_TYPE__ [, arg2: __ARG2_TYPE__]]...): void
}

示例:

// as inline type
const emits = defineEmits<{
  (eventName: 'hover', hovering: boolean): void
  (eventName: 'changed', newValue: number, id: string): void
}>()
// as interface
interface Emits {
  (eventName: 'hover', hovering: boolean): void
  (eventName: 'changed', newValue: number, id: string): void
}
const emits = defineEmits<Emits>()
// as type alias
type Emits = {
  (eventName: 'hover', hovering: boolean): void
  (eventName: 'changed', newValue: number, id: string): void
}
const emits = defineEmits<Emits>()

为您的update:checked事件,代码应类似于以下内容:

// as inline type
const emits = defineEmits<{
  (e: 'update:checked', checked: boolean): void
}>()
// as interface
interface Emits {
  (e: 'update:checked', checked: boolean): void
}
const emits = defineEmits<Emits>()
// as type alias
type Emits = {
  (e: 'update:checked', checked: boolean): void
}
const emits = defineEmits<Emits>()

https://stackoverflow.com/questions/69399586/

相关文章:

python - 如何检查字符串中的特定元素在python中是否相等?

powershell - 设置 PSReadLineOption : A parameter can

c++ - 从 std `vector` 库创建的 `` 和从 : `STL vec

python - 检查文件夹,如果不存在则创建它

python - 正则表达式:在前瞻断言的最后一场比赛之后直到前瞻断言的第一场比赛之后查找文本

python - 无法让 VS Code 将参数从 launch.json 传递给 Python

regex - 如何在 perl regex 替换命令中使用 unicode 字符?

angular - TS2322 : Type 'HTMLDivElement' is not as

ios - 是否有修改器可以更改 SwiftUI Picker 的标签颜色?

tailwind-css - 如何使用 Tailwind CSS 定位具有特定数据属性的元素?