【问题标题】:Typescript/Vue3 - Forced to use type 'any'Typescript/Vue3 - 强制使用类型“任何”
【发布时间】:2021-10-14 03:10:18
【问题描述】:

我有一个可组合的函数,它返回一个对象数组和一个接收字符串但不返回任何内容的函数。

以下代码“有效”并且不会引发任何错误。

import { ref } from "vue";
import { useRoute } from "vue-router";

interface RouterHelper {
    children: any;
    getChildrenOf: (name: string) => void;
}

export const routerHelper = (): RouterHelper => {
    const route = useRoute();
    const children = ref();

    const getChildrenOf = (name: string) => {
        children.value = route?.matched
            ?.find((r) => r.name === name)
            ?.children.filter((c) => c.alias);
    };

    return { children, getChildrenOf };
};

但是,它并不完全准确。例如,在声明 children ref 时,应该是:

const children = ref([]);

但我收到此错误:

TS2322: Type 'RouteRecordRaw[] | undefined' is not assignable to type 'never[]'.

另外,在界面中,我必须为 children 属性使用 any 而不是正确类型的 []

请注意,我对 Typescript 很陌生,所以当我说“正确”时,请谨慎对待。

有什么方法可以让这段代码变得更好,而不是像任何方法一样使用全部捕获?

谢谢!

【问题讨论】:

    标签: javascript typescript vue.js vuejs3


    【解决方案1】:

    ref 最终分配给route.matched[].children 的子集,其类型为RouteRecordRaw[]

    Optional chaining(在route.matched.find(...)?.children 中)与undefined 短路,因此如果Array.prototype.find() 找不到匹配项,则引用类型将为undefined。否则,它将是RouteRecordRaw[]

    因此,引用的value 字段键入为RouteRecordRaw[] | undefined。最后,ref() 的返回值是Ref<T> 类型(其中Tref() 的参数类型),所以children 的类型是Ref<RouteRecordRaw[] | undefined>

    import { ref, Ref } from "vue";
    import { useRoute, RouteRecordRaw } from "vue-router";
    
    interface RouterHelper {
                             ?
        children: Ref<RouteRecordRaw[] | undefined>;
        getChildrenOf: (name: string) => void;
    }
    
    export const routerHelper = (): RouterHelper => {
        const route = useRoute();
                                 ?
        const children: RouterHelper['children'] = ref([]);
    
        const getChildrenOf = (name: string) => {
            children.value = route.matched
                .find((r) => r.name === name)
                ?.children.filter((c) => c.alias);
        };
    
        return { children, getChildrenOf };
    };
    

    【讨论】:

    • 我最终改变了很多逻辑,但是 RouteRecordRaw 最终仍然有帮助,所以把它作为答案。你有没有机会解释一下这个原因?如果您有ref,请始终使用Ref&lt;something something&gt;
    • @RizaKhan ref() 的返回值是通用的Ref&lt;T&gt;T 可以从原始值(strings 和 numbers)推断出来,但不能用于复杂类型(在这种情况下为对象数组)。请参阅更新的答案,了解我是如何得出最终类型的。
    猜你喜欢
    • 2021-06-30
    • 2019-09-28
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2020-11-19
    • 2021-03-02
    相关资源
    最近更新 更多