我对 Stripe Node.js API 有问题(apiVersion '2020-08-27' - 截至 2022-07-21 是最新的)。
方法返回类型为Promise<Stripe.Response<Stripe.Customer | Stripe.DeletedCustomer>>
的响应。
根据文档和这里的 Github 线程:使用可区分的联合来更轻松地区分类型,如果来自 customers.retrieve 的响应具有属性deleted
=true
,则类型应DeletedCustomer
,否则应Customer
。
上面的链接表明,检查已删除的属性就足够了,如下所示,然后 TypeScript 应该能够辨别响应表示Customer
而不是DeletedCustomer
。
let customer = await this.stripe.customers.retrieve(customerId, { expand: ['subscriptions'] })
if (!customer.deleted) {
const subscriptions = customer.subscriptions[0]
}
但是,Customer
的任何属性在条件块中都按预期不可用。
我有一个解决方案,似乎可以满足我的需要 - 但它似乎不是"按书本",我希望我能弄清楚 TypeScript 是否可以为我解决这个问题。 这是我的解决方案:
if (customer.deleted) return
customer = <Stripe.Response<Stripe.Customer>>customer
const subscription = customer.subscriptions[0]
编辑以添加: 我应该补充一点,这是一个Nest.js项目。
我看到打字稿 4.4.4 可以正常工作。
在此处查看代码沙盒链接
import { Stripe } from "stripe";
const stripe = new Stripe("x", { apiVersion: "2020-08-27" });
const fn = async () => {
const customer = await stripe.customers.retrieve("x", {
expand: ["subscriptions"]
});
if (!customer.deleted) {
console.log(customer); // customer here resolves to Stripe.Customer & { ... }
const subscriptions = customer.subscriptions;
const subscription = subscriptions && subscriptions.data[0]; // note that this is slightly different from your code
} else {
console.log(customer); // customer here resolves to Stripe.DeletedCustomer & { ... }
}
};
问题配置选项为:"strictNullChecks": false
,以及 tsconfig 中缺乏strict: true
。
如果严格,则 strictNullChecks 的默认值为 true,否则为 false。 https://www.typescriptlang.org/tsconfig#strictNullChecks
因此,必须使用"strict": true
来解决此问题。