如何通过强制转换缩小打字稿类型,这是错误的?

时间:2020-05-07 04:43:40

标签: typescript

我正在运行用打字稿编写的javascript应用程序。 在代码的某个地方,我有这样的东西

{
  title: props.value?.name as string
}

一个朋友告诉我,这不是键入强制转换的好方法,因为我们假装不存在undefined。 我不明白这一点,因为这行得通,而且我也看不到它会破裂。

您能向我解释一下如何通过类型转换来缩小打字稿类型,这是不好的,而且永远不应该这样做吗?

1 个答案:

答案 0 :(得分:4)

如果需要使用可选链接,那么您不知道属性实际上是否存在:

const props = {
    value: Math.random() < 0.5 ? undefined : { name: 'foo' }
};
const someObj = {
    title: props.value?.name as string
}

如果valueundefined,则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