React+TypeScript类型校验疑问:setLocale未按定义传参为何无报错?
为什么不符合定义的
setLocale不会触发TypeScript报错? 这俩现象都是TypeScript函数类型兼容性规则导致的:
参数数量的兼容性:TypeScript允许参数更少的函数,赋值给参数要求更多的函数类型。比如你定义的
setLocale要求接收一个Locale类型参数,但传() => {}这种无参函数时,TypeScript判定合法——因为当外部调用setLocale('ko')时,这个无参函数只会忽略传入的参数,不会引发运行时错误。返回值的兼容性:当函数类型的返回值是
void时,TypeScript允许任何返回值类型的函数赋值给它。你写() => { return "hello" }时,虽然返回了字符串,但因为定义里setLocale的返回值是void,TypeScript只关心你有没有在调用这个函数时使用它的返回值,不会限制函数本身的返回内容。
另外要注意:这里只是上下文的默认值没报错,如果你在组件里用useContext拿到setLocale后,错误调用它(比如不传参或传错类型),TypeScript会在调用处正常报错——默认值的兼容性是TypeScript为灵活性做出的设计,毕竟默认值大多是兜底用的。
内容的提问来源于stack exchange,提问作者BMAIL
相关产品推荐
相关产品推荐

