【问题标题】:What's Vue 3 composition API's type-safe way of defining methods什么是 Vue 3 组合 API 定义方法的类型安全方式
【发布时间】:2021-06-28 15:13:18
【问题描述】:

我正在使用 Vue 的组合 API(在 Vue.js 3 中)并主要在 setup() 中构建我的组件逻辑。虽然accessing my own props 通过setup(props) 直截了当,但我无法以类型安全的方式将此处定义为methods 的函数公开。

以下工作,但我需要任意转换,因为没有暴露给 TypeScript 的方法接口。

<!-- MyComponent.vue -->

<script lang='ts'>
// ...
export default defineComponent({
  setup() {
    // ...
    return {
       publicFunction: async (): Promise<void> => { /* ... */ };
    }
  }
});

</script>
<!-- AppComponent.vue -->

<template>
  <MyComponent ref="my"/>
</template>

<script lang='ts'>

export default defineComponent({
  async setup() {
    const my = ref();

    async func() {
      await (my.value as any).publicFunction(); // <-- gross!
    }

    return { my, func };
  }
});

</script>

methods 中定义我的函数不是一种选择,因为那样的话,我将无法从设置中访问它。

【问题讨论】:

    标签: typescript vuejs3 vue-composition-api


    【解决方案1】:

    您正在寻找InstanceType

    import MyComponent from 'path/to/the/component';
    
    export default defineComponent({
      async setup() {
        const my = ref<InstanceType<typeof MyComponent>>();
    
        async func() {
          await my.value?.publicFunction();
        }
    
        return { my, func };
      }
    });
    

    这种方法的一个警告是(如您所见)您必须使用optional chainingnon-null assertion operator,除非您将初始/默认实例作为参数传递给ref() 函数;否则,TypeScript 会将其标记为“可能未定义”。

    在大多数情况下,如果您确定它总是会被定义,您可以使用as-syntax 将其类型转换为一个空对象。

    const my = ref({} as InstanceType<typeof MyComponent>);
    
    async func() {
      await my.value.publicFunction();
    }
    

    【讨论】:

    • 正是我想要的,谢谢!不幸的是,官方 Vue.js 文档中没有提到这一点。
    • 感谢您的回答,但我在 vue3 中使用 SFC 和 Typescript 所以有什么建议吗?我猜在 SFC 方法中是不公开的
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2012-04-07
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多