如何在vue 3中从`defineComponent()`中键入vue示例?

hrirmatl  于 2023-04-21  发布在  Vue.js
关注(0)|答案(2)|浏览(217)

如你所知,从Vue 3开始,组件可以用TypeScript编写:

/// modal.vue

<template>
  <div class="modal"></div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "Modal",
  props: {
    foo: String,
    bar: String
  },
  mounted() {
    this.$props.foo // how to type `this` out of this context?
  }
});
</script>

我的问题是如何从defineComponent函数中输入vue示例?

/// another ts file.
let modal:???; // what the `???` should be?

modal.$props.foo // infer `$props.foo` correctly
brjng4g3

brjng4g31#

我想给予的“简单”答案是使用ReturnType<typeof defineComponent>,但是它不携带任何类型信息。当我开始研究如何将ReturnType与泛型方法一起使用时,我陷入了stackoverflow的兔子洞,这些似乎需要探索
然而,在看过之后,vue有一个导出的类型ComponentPublicInstance,可以相当容易地使用。ComponentPublicInstance也有一些不同的泛型参数。

import { ComponentPublicInstance } from 'vue';

let instance: ComponentPublicInstance<{ prop: string }, { value: string }>;
polkgigr

polkgigr2#

使用TypeScript的内置InstanceType实用程序提取其示例类型

import Modal from './modal.vue'

type ModalInstance = InstanceType<typeof Modal>

type Foo = ModalInstance['$props']['foo']

另一个使用实用程序类型:

import { AllowedComponentProps, Component, defineComponent, VNodeProps } from 'vue'

export type ExtractComponentProps<TComponent> =
  TComponent extends new () => {
    $props: infer P;
  }
    ? Omit<P, keyof VNodeProps | keyof AllowedComponentProps>
    : never;
  
const TestComponent = defineComponent({
  props: {
    disabled: {
      type: Boolean,
    },
  },
});
  
type Props = ExtractComponentProps<typeof TestComponent>

// type Props = {
//   disabled?: boolean | undefined;
// }

相关问题