我希望类型检查器能够打印下面示例的错误。这是一个bug还是设计?请注意,如果您删除?
,您将收到错误,正如人们所期望的那样。
type Right = { right?: boolean }
type Wrong = { wrong: number }
function returnWrong(callback: (param: Right) => Right) { }
returnWrong((param: Wrong) => param.wrong) // should fail but doesn't
参数和返回类型都与调用中声明的不同,但编译器似乎无法捕获它。
我有strictNullChecks且noImplicitAny已启用。
这是一个更详细的示例,该类型检查确定但会引发运行时错误。
function returnWrongX(p: Right, callback: (param: Right) => Right) {
return callback(p).right
}
returnWrongX({}, (param: Wrong) =>
param.wrong)
编辑:
Saravana建议添加& object
作为解决方法。这适用于上述情况,但仍有可能通过嵌套Wrong
对象来进一步阐述该示例:
type Right = { right?: boolean } & object // added `& object`
type Wrong = { wrong: {fail: number} } // Wrong.wrong is now an object
function returnWrongX(p: Right, callback: (param: Right) => Right) {
return callback(p).right
}
// `param` is expecting a `Wrong` but receiving a `Right`
// so it throws a runtime error
returnWrongX({}, (param: Wrong) => param.wrong.fail ? {} : {})
答案 0 :(得分:1)
TypeScript是structurally typed。因此,根据您对Right
的定义,Wrong
的所有可能值都与Right
兼容:
let objw: Wrong = {
wrong: 1
}
let objr: Right = objw; // No error
类型Wrong
的任何值都保证至少是一个对象{wrong: number}
,它满足Right
接受任何内容的要求,包括number
({{1}从回调中返回类型。这就是编译器不会抛出任何错误的原因。