给出:
type Data = {
isRoot: true
} | {
isRoot: false
disabled: boolean
name: string
}
function nameGetter(d: Data): string | false {
if (d.isRoot) {
return false
} else {
return d.name // error here: property 'name' doesnt exist on type Data
}
}
那是为什么?如果我在isRoot上使用字符串文字
type Data = {
isRoot: 'true'
} | {
isRoot: 'false'
disabled: boolean
name: string
}
function nameGetter(d: Data): string | false {
if (d.isRoot === 'true') {
return false
} else {
return d.name
}
}
代码可以编译!
答案 0 :(得分:3)
问题在于,如果没有--strictNullChecks
,if(d.isRoot)
实际上会在两个可能的条件下失败。当else
为d.isRoot
或为false
时,它将落入null
块中。观察:
declare const d: Data;
d.isRoot = null; // throws an error only if --strictNullChecks is enabled
您需要启用--strictNullChecks
,以确保d.isRoot
也不能是null
。
还要注意,即使没有--strictNullChecks
,以下代码也可以正常工作:
function nameGetter(d: Data): string | false {
if (d.isRoot === true) {
return false
} else {
return d.name
}
}