typescript - 如何将类型从 Vue3 组件导出到全局范围?

标签 typescript vuejs3

我有两个全局注册的组件 ParentComponentChildComponent。全局注册的优点之一是全局注册的组件在应用程序中随处可用。换句话说,我不必在其他组件中导入它们来使用它们。不幸的是,关于类型不能说同样的话。要从组件访问类型,我需要导入它(检查下面的 ParentComponent 代码)无论该组件是否已全局注册。有没有一种方法可以将类型从组件导出到“全局”范围并使其在应用程序的任何位置都可用?

ma​​in.ts

import { createApp} from 'vue'

import App from './App.vue'
import ParentComponent from './ParentComponent.vue'
import ChildComponent from './ChildComponent.vue'

const app = createApp(App)

app.component('parent-component', ParentComponent)
app.component('child-component', ChildComponent)

app.mount('#app')

ChildComponent(摘录)

export type ChildComponentEvent = {
  message: string
}

export default defineComponent({
  methods: {
    emitEvent () {
      const event: ChildComponentEvent = {
        message: 'Hello from child'
      }
      this.$emit('child-event', event)
    }
  }
})

ParentComponent(摘录)

import { ChildComponentEvent } from './ChildComponent'

export default defineComponent({
  methods: {
    childEventHandler (event: ChildComponentEvent) {
      console.log(event)
    }
  }
})

最佳答案

首先,把事情弄清楚。这是两个不同且不相关的概念:

Vue 的组件注册让您可以将组件添加到您的应用程序实例,以供您的代码的各个部分在运行时使用,而无需每次都显式加载它们。 Vue 应用程序不必使用 typescript 。

Typescript 的类型在设计和“编译”时起作用,当 typescript 编译为 javascript 时,此信息会被忽略,并且在运行时没有任何影响。无论您编写的是 Vue 还是其他应用程序,Typescript 声明和类型导入/导出规则都适用。

您可以在 typescript 中声明全局类型和接口(interface)。如果你想从一个模块(比如你用来声明你的 Vue 组件的文件单元)做到这一点,你可以使用 declare global syntax :

declare global {
  interface SomeGlobalInterface {
    ...
  }
}

在您的 Typescript 项目中(在 tsconfig.json 文件中配置),这些类型将全局可用。

通常建议避免全局类型声明,它可能导致冲突和类型缺失(例如,当您尝试在不同的 tsconfig 环境中导入使用全局类型的模块时,这在单元测试中经常发生,例如).

对于每个逻辑代码单元来说,声明和导出其类型以便从需要它们的任何地方导入通常会更好,即使这会使代码更加冗长。您可以将相关类型分组到一个模块中,并且只导入它的类型。

当您只需要键入而不需要值时,请使用 typescript 的 import type 语法(请参阅 modules docs )。这有助于避免在运行时加载不必要的模块并防止模块循环引用。

关于typescript - 如何将类型从 Vue3 组件导出到全局范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839513/

相关文章:

javascript - Vue 组件 - 将 prop 传递到类中不起作用?

vue.js - 该值未绑定(bind)在 PrimeVue/TreeSelect 中

typescript - 在 MacO 上运行 Ionic 项目后出现大量 TypeScript 错误

javascript - 如何在js/ts树中查找节点的搜索路径

TypeScript - 特定的字符串类型

typescript - typescript 有没有办法说 "and any others"

vue.js - Electron 中的 Vite + Vue3 : how to import and use Material Design Icons @mdi/font (or any other icon font)

Fabricjs,选择 handle 显示但在与其他形状一起选择之前不可点击

javascript - 有什么方法可以在对象键上使用 'defined' 运算符吗?

javascript - 将带有键值对数组的 JavaScript 对象发布到 Web Api 时遇到问题