_.isUndefined()在TypeScript中不起作用?

_.isUndefined()在TypeScript中不起作用?,typescript,Typescript,这是我正在使用的代码。我正在显式地检查未定义的,然后尝试配置PayPal Rest SDK 但是,我在TypeScript中遇到了这个错误: 类型为{mode:string;客户端id:string |未定义; client_secret:string | undefined;}不可分配给参数 类型为“配置选项”。属性“客户端id”的类型为 不相容的 类型“string | undefined”不可分配给类型“string”。 类型“未定义”不可分配给类型“字符串” 为什么TypeScript仍

这是我正在使用的代码。我正在显式地检查
未定义的
,然后尝试配置PayPal Rest SDK

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

类型为{mode:string;客户端id:string |未定义; client_secret:string | undefined;}不可分配给参数 类型为“配置选项”。属性“客户端id”的类型为 不相容的 类型“string | undefined”不可分配给类型“string”。 类型“未定义”不可分配给类型“字符串”


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

因为您已经在检查键是否未定义,所以可以附加一个
键强制输入

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,
    });
}

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

client_id: process.env.PAYPAL_CLIENT_ID!,
client_secret: process.env.PAYPAL_CLIENT_SECRET!,
这将允许编译器验证值是否已定义。如果您不关心编译器为您进行验证,并且您乐于自己断言定义的值,那么可以使用感叹号,正如@FilipeSabella所建议的那样


希望有帮助;祝你好运

好的。让我来测试一下。
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
  });
}