打字稿可选属性中断功能参数的实施类型



我希望类型检查器为下面的示例打印错误。这是一个错误还是设计?请注意,如果您删除?,您将会得到错误,如人们所期望的。

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;工作(在内的任何内容。这就是为什么编译器不会丢任何错误的原因。

相关内容

  • 没有找到相关文章

最新更新