TypeScript可选属性用于函数参数的类型强制执行

时间:2017-04-19 03:30:35

标签: typescript

我希望类型检查器能够打印下面示例的错误。这是一个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 ? {} : {})

1 个答案:

答案 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}从回调中返回类型。这就是编译器不会抛出任何错误的原因。

相关问题