我试图理解为什么Typescript无法正确获取内部函数内部的对象属性参数的类型(该参数可以是未定义的),但当同一属性被分配给外部函数范围中的自己的变量时,缩小就会无缝发生.
我用这个片段来重现这个问题:
type MyType = {
optional?: string
}
(arr: string[], param: MyType) => {
if (param.optional) {
const includes = arr.includes(param.optional) // <-- Fine
arr.filter(function (item) {
return item.includes(param.optional) // <-- Wrong! Type undefined is not assignable...
})
}
}
在if分支中,Typescript警告我在过滤器内部函数中使用param.optional
,因为它可能是string | undefined
,无论当它在arr.includes(param.optional)
中使用时,根本没有任何警告.
这对我来说似乎很奇怪,因为如果我不使用param.optional
,而是将相同的值赋给它自己的变量Typescript,就能够完美地缩小其类型(string
).
type MyType = {
optional?: string
}
(arr: string[], param: MyType) => {
const variable = param.optional
if (variable) {
const includes = arr.includes(variable) // <-- Fine
arr.filter(function (item) {
return item.includes(variable) // <-- Fine
})
}
}
为什么会发生这种行为?它与对象本身有什么关系(因为如果参数只是原始可选值string | undefined
,这个问题就不会发生)?