我是否缺少 TS 配置参数来强制从联合中获取类型?



我对 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来解决此问题。

相关内容

  • 没有找到相关文章