【问题标题】:_.isUndefined() is not working in TypeScript?_.isUndefined() 在 TypeScript 中不起作用?
【发布时间】:2017-10-07 14:07:57
【问题描述】:
if (process.env.NODE_ENV === 'production') {
    if (!_.isUndefined(process.env.PAYPAL_CLIENT_ID) && !_.isUndefined(process.env.PAYPAL_CLIENT_SECRET)) {
        paypal.configure({
            mode: 'live',
            client_id: process.env.PAYPAL_CLIENT_ID,
            client_secret: process.env.PAYPAL_CLIENT_SECRET,
        });
    }
} else {
    paypal.configure({
        mode: 'sandbox',
        client_id: process.env.PAYPAL_CLIENT_ID,
        client_secret: process.env.PAYPAL_CLIENT_SECRET,
    });
}

这是我正在使用的代码。我正在明确检查undefined,然后尝试配置 PayPal Rest SDK。

但是,我在 TypeScript 中遇到了这个错误:

类型参数 '{ mode: string;客户 ID:字符串 |不明确的; client_secret: 字符串 |不明确的; }' 不可分配给参数 'ConfigureOptions' 类型。属性“client_id”的类型是 不相容。 键入'字符串 | undefined' 不能分配给类型 'string'。 类型“未定义”不可分配给类型“字符串”。

为什么 TypeScript 仍然认为变量可能是 undefined..?这是特定于环境变量的吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    lodash 的 isUndefined() 对你来说不能起到类型保护的作用,这令人困惑。看起来这是 TypeScript 中的一个已知限制(与 Microsoft/TypeScript#11483Microsoft/TypeScript#10530 有关)。简而言之,对字符串索引的属性进行缩小(所有属性都在process.env 中进行字符串索引)对于编译器来说太昂贵了。所以它不这样做。建议的解决方法是将您关心的属性复制到它们自己的变量中,如下所示:

    const paypalClientId = process.env.PAYPAL_CLIENT_ID
    const paypalClientSecret = process.env.PAYPAL_CLIENT_SECRET
    if (!_.isUndefined(paypalClientId) && !_.isUndefined(paypalClientSecret)) {
      paypal.configure({
        mode: 'live',
        client_id: paypalClientId, // ok, narrowed to string
        client_secret: paypalClientSecret, // ok, narrowed to string
      });
    }
    

    这应该允许编译器验证值是否已定义。如果您不关心编译器为您进行验证并且您很乐意自己断言定义的值,您可以按照@FilipeSabella 的建议使用感叹号。

    希望有所帮助;祝你好运!

    【讨论】:

    • 好的。让我测试一下。
    【解决方案2】:

    由于您已经在检查键是否未定义,因此您可以将 ! 附加到键以强制类型。

    client_id: process.env.PAYPAL_CLIENT_ID!,
    client_secret: process.env.PAYPAL_CLIENT_SECRET!,
    

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2018-11-08
      • 2017-08-05
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多