Typescript 如何通过铸造缩小字体脚本类型,错了吗?

Typescript 如何通过铸造缩小字体脚本类型,错了吗?,typescript,Typescript,我正在运行一个用typescript编写的javascript应用程序。 在代码的某个地方我有这样的东西 { title: props.value?.name as string } 一位朋友告诉我,这不是一个很好的类型转换方法,因为我们假装未定义的不存在。 我不明白这一点,因为这是可行的,我看不到它曾经打破 您能否向我解释一下,如何通过类型转换来缩小typescript类型的范围,这不好,而且永远不应该这样做?如果您需要使用可选链接,那么您不知道该属性是否实际存在: 但是title属性仍

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

{
  title: props.value?.name as string
}
一位朋友告诉我,这不是一个很好的类型转换方法,因为我们假装未定义的不存在。 我不明白这一点,因为这是可行的,我看不到它曾经打破


您能否向我解释一下,如何通过类型转换来缩小typescript类型的范围,这不好,而且永远不应该这样做?

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

但是title属性仍将作为字符串键入,这意味着您可以这样做

someObj.title.startsWith('bar')
这将引发运行时错误,最终由不正确的类型断言引起

由于您不知道value对象是否存在,因此应将标题键入string | undefined,以防可选链接失败-这样,对someObj.title的引用必须先将其缩小为字符串,然后再对其使用string方法:

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

如果需要使用可选链接,则不知道该属性是否实际存在:

但是title属性仍将作为字符串键入,这意味着您可以这样做

someObj.title.startsWith('bar')
这将引发运行时错误,最终由不正确的类型断言引起

由于您不知道value对象是否存在,因此应将标题键入string | undefined,以防可选链接失败-这样,对someObj.title的引用必须先将其缩小为字符串,然后再对其使用string方法:

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');
}
const someObj = {
    title: props.value.name as string
};