繁体   English   中英

是否可以为 httpsCallable 函数指定输入和返回类型?

[英]Is it possible to specify input and return types for httpsCallable functions?

我在应用程序中使用可调用的 function 来更新用户声明。 firebase 函数在 Typescript 中,并且有一个接口来描述 function 所需的数据形状。

我想在客户端做同样的事情,这样团队中的任何开发人员都可以快速找出对云 function 的要求,而无需查看函数目录中的代码。

functions/src/index.ts


// This is the required data, that I would like to specify client side
interface GivePermissionsParams {
  uid: string;
  email: string;
  newClaim: Partial<Permissions>;
}

/**
 * Callable function to give a user new permissions in the form
 * of custom claims and firestore properties
 */
exports.givePermission = functions.https.onCall(
  async (data: GivePermissionsParams, context) => {
    if (!context.auth?.token.admin) {
      throw new HttpsError(
        'permission-denied',
        `Non admin user ${context.auth?.uid} attempted to update permissions`
      );
    }
    return grantPermission(data.uid, data.newClaim).then(() => {
      log(`Successfully updated permissions for ${data.email}`);
      return {
        result: `Successfully updated permissions for ${data.email}`,
      };
    });
  }
);

客户端使用:

// firebase.ts

// I would like to specify the function param and return types here.
// eg: httpsCallable<myParamsType, myReturnType>
export const givePermission = httpsCallable(functions, 'givePermission');
// in my reactComponent.tsx

  const changePermission = async (permission: string, value: boolean) => {

    // This payload should match the GivePermissionsParams type as defined in the functions index.ts file. 
    const functionParams = {
      uid: user.uid,
      email: user.email,
      newClaim: {[permission]: value}
    }

    const functionRes = await givePermission(functionParams);
  };

看来解决方案就是您正在尝试做的事情。 您可以为请求数据和响应指定类型,如下所示:

interface ReqInterface {
  uid: string;
  email: string;
  newClaim: Partial<Permissions>;
}

interface ResInterface {
  result: string;
}

const givePermission = httpsCallable<ReqInterface, ResInterface>(functions, 'givePermission')

const { data } = await givePermission({ url })
// data is ResInterface

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM