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
..?这是否特定于环境变量?
答案 0 :(得分:1)
令人困惑的是,lodash的isUndefined()
并不能成为你的后卫。看起来这是TypeScript中的已知限制(与Microsoft/TypeScript#11483和Microsoft/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
以强制输入密钥。
!