0

我正在尝试在使用 Typescript 的反应项目中在结帐时实施 Apple Pay。我已经安装了braintree-web 包并按照braintree 网站上的说明来初始化我的ApplePaySession. 虽然打字稿允许我编译项目,但在浏览器中我的调用new ApplePaySession(3, paymentRequest);是未定义的。我绞尽脑汁,但我不明白出了什么问题。这是我如何初始化 ApplePay 的代码片段。

import { applePay, ApplePayStatusCodes, ApplePaySession } from 'braintree-web';

...

beginApplePay() {
    if (!this.btApplePayInstance) {
      //throw an erro
    }

    const paymentRequest = this.createPaymentRequest();
    const session = this.createSession(paymentRequest);

    session && session.begin();
  }

  createSession(
    paymentRequest: braintree.ApplePayPaymentRequest
  ): braintree.ApplePaySession | null {
    let session: braintree.ApplePaySession;
    console.log('creating session');
    console.log('Sample payment request: ', paymentRequest);
    console.log(
      'Supports API v3: ' + window.ApplePaySession.supportsVersion(3)
    );


    try {
      debugger;
      session = new ApplePaySession(3, paymentRequest); //this is where it fails
      console.log(session);
    } catch (err) {
      console.log(err);
      //throw an error
      return null;
    }

这是我的浏览器所说的: TypeError: undefined is not a constructor (evaluating 'new braintree_web__WEBPACK_IMPORTED_MODULE_1__["ApplePaySession"](3, paymentRequest)')

任何对出了什么问题的见解将不胜感激。

4

2 回答 2

0

更新:我发现这是一个打字稿特定的问题。在 Braintree-web 的类型定义中,它们定义了ApplePaySession. 构建项目时,浏览器认为这ApplePaySession是对 Braintree-web 中某个类的引用,而实际上它是ApplePaySession对 safari 浏览器的本机的引用。

我找到的解决方案是使用 ApplePayWebJS 的类型并引用ApplePaySession那里提供的。然而,当试图让两个包的类型很好地结合在一起时,这确实产生了一些问题。

于 2019-12-04T19:29:42.850 回答
0

我发现添加

<script src="https://js.braintreegateway.com/web/3.55.0/js/apple-pay.min.js"></script>

在顶级 Js 文件为我工作,然后在使用会话时使用 @ts-ignore。

我知道丑陋的解决方法...如果您找到了更好的解决方案,请分享。

于 2019-11-25T15:14:35.720 回答