我正在运行用打字稿编写的javascript应用程序。 在代码的某个地方,我有这样的东西
{
title: props.value?.name as string
}
一个朋友告诉我,这不是键入强制转换的好方法,因为我们假装不存在undefined。 我不明白这一点,因为这行得通,而且我也看不到它会破裂。
您能向我解释一下如何通过类型转换来缩小打字稿类型,这是不好的,而且永远不应该这样做吗?
答案 0 :(得分:4)
如果需要使用可选链接,那么您不知道属性实际上是否存在:
const props = {
value: Math.random() < 0.5 ? undefined : { name: 'foo' }
};
const someObj = {
title: props.value?.name as string
}
如果value
为undefined
,则someObj
为:
{
title: undefined
}
,但是title
属性仍将以 string 的形式键入,这意味着您将被允许这样做
someObj.title.startsWith('bar')
这将引发运行时错误,最终是由错误的类型声明引起的。
由于您不知道value
对象是否存在,因此应将title
键入为string | undefined
,以防万一可选链接失败-这样,引用{{1 }}在使用字符串方法之前,必须将其缩小为字符串:
someObj.title
如果您确实知道const props = {
value: Math.random() < 0.5 ? undefined : { name: 'foo' }
};
const someObj = {
title: props.value?.name as (string | undefined)
// above type assertion not necessary if TS can already recognize
// that it's a string or undefined
// like in this example
};
if (someObj.title) {
console.log(someObj.title.startsWith('bar'));
} else {
console.log('it is undefined');
}
对象存在并且其value
属性是字符串,请删除可选链接:
name