挂钩引发TypeScript错误(类型不匹配?)

kqhtkvqz  于 2023-02-25  发布在  TypeScript
关注(0)|答案(1)|浏览(156)

我正在用TypeScript编写一个useProject钩子,它调用useProjectFunctions.ts中声明的函数。
useProject钩子中,TypeScript抛出一个错误,表明类型不匹配,但我看不出这是怎么回事。

    • 使用项目函数. d. ts**
export declare type GetImageUploadToken = ({ ...params }: {
    organisationId: string,
    projectId: string,
    imageName: string,
    isAdminRequest?: boolean,
}) => {
    status: 'success';
    tokenId: string;
}
    • 使用项目函数. ts**
export function useProjectFunctions() {
    const { functions } = useFirebase();

    async function getImageUploadToken({ ...params }: Parameters<GetImageUploadToken>[0]) {
        const response = httpsCallable<any, ReturnType<GetImageUploadToken>>(functions, ProjectFunctions.GET_IMAGE_UPLOAD_TOKEN);
        return (await response({ ...params })).data;
    };

    return {
        getImageUploadToken
    };
}
    • 使用项目. ts**
export function useProject() {
    const { getImageUploadToken } = useProjectFunctions();

    return {
        addImage: () => addImage({ getImageUploadToken })
    };
}

async function addImage({ getImageUploadToken }: {
    getImageUploadToken: GetImageUploadToken;
}) {
    const tokenCallResponse = getImageUploadToken({
        organisationId: 'orgId1',
        projectId: 'projId1',
        imageName: 'fileName',
        isAdminRequest: false
    });
}

useProject.ts中,TS在addImage: () => addImage({ getImageUploadToken })行上生成以下错误:
类型'({...参数}:{组织ID:字符串;项目ID:字符串;图像名称:字符串;是否为管理请求?:布尔值;})=〉承诺〈{状态:"成功";令牌ID:字符串;}〉"不能赋给类型" GetImageUploadToken "。
类型"承诺〈{状态:"成功";令牌ID:string ;}〉"缺少类型" {status:"成功";令牌ID:字符串;}":状态,令牌ID
所需类型来自属性"getImageUploadToken",该属性在此处对类型"{project:私有项目接口;设置项目:调度;文件:文件;admin?:布尔型;获取图像上传令牌:获取图像上传令牌;存储:Firebase存储;}' }'
这个错误到底是什么意思,我该如何修复它?

e3bfsja2

e3bfsja21#

您的类型GetImageUploadToken是一个对象,而getImageUploadToken返回的类型是一个在完成时解析为GetImageUploadToken的承诺。
要修复此问题,可以在addImage中更改getImageUploadToken的类型:获取图像上传令牌以获取图像上传令牌:承诺
这将告诉typescript您正在向addImage传递一个异步函数
然后,您需要等待异步getImageUploadToken函数,因此将函数调用更改为常量tokenCallResponse = await getImageUploadToken({
如果您仍然不确定,我建议您阅读一下异步函数和javascript中的承诺

相关问题