我希望类型检查器为下面的示例打印错误。这是一个错误还是设计?请注意,如果您删除?
,您将会得到错误,如人们所期望的。
type Right = { right?: boolean }
type Wrong = { wrong: number }
function returnWrong(callback: (param: Right) => Right) { }
returnWrong((param: Wrong) => param.wrong) // should fail but doesn't
参数和返回类型都与调用中的声明不同,但编译器似乎没有捕获。
我有严格的努力,启用了noimplicity。
这是一个更精致的示例,类型可以检查确定但会引发运行时错误。
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 ? {} : {})
打字稿在结构上键入。因此,基于您对Right
的定义,Wrong
的所有可能值都与Right
兼容:
let objw: Wrong = {
wrong: 1
}
let objr: Right = objw; // No error
和类型Wrong
的任何值都可以保证为最低的对象{wrong: number}
,它满足Right
的要求,该对象接受包括number
(let num: Right = 55;
工作(在内的任何内容。这就是为什么编译器不会丢任何错误的原因。