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

时间:2017-10-07 14:07:58

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

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

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

  

类型的参数'{mode:string; client_id:string |不确定的;   client_secret:string |不确定的; }'不能赋值给参数   'ConfigureOptions'类型。属性'client_id'的类型是   不相容。       输入'string | undefined'不能赋值为'string'。         类型'undefined'不能分配给'string'类型。

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

2 个答案:

答案 0 :(得分: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建议的感叹号。

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

答案 1 :(得分:0)

由于您已经检查了密钥是否未定义,因此您可以在密钥上附加SELECT d.id destination_id, d.name destination_name, count(a.id) AS nb_activity, string_agg('{"id":'||a.id||',"name":"'||a.name||'","pictures":"'||a.pictures||'","meta":'|| ( SELECT array_to_json(array_agg(t))::TEXT --cast to TEXT to concatenate to the string FROM ( SELECT adp.amount, ad.label FROM activity a2 LEFT JOIN activity_duration ad ON (ad.activity_id = a2.id) LEFT JOIN activity_duration_price adp ON (adp.activity_duration_id = ad.id) ) AS t ) ||'}' ,',' ) AS activities FROM destination d LEFT JOIN activity a ON (a.destination_id = d.id) WHERE d.id = ANY (ARRAY[142]) GROUP BY d.id, d.name ORDER BY nb_activity DESC 以强制输入密钥。

!