TypeScript变量类型意外变更求助:number为何变为boolean?
这不是Bug,是TypeScript类型推断的“宽松”特性导致的!
嘿,你遇到的这个情况完全不是Bug,而是因为你忽略了TypeScript中**未指定类型的变量会被推断为any**这个关键细节,咱们一步步拆解:
问题根源:myEcho的类型是any
你只写了let myEcho;,没有给它指定明确的类型,TypeScript会默认把它推断为any类型。any类型是TypeScript里的“万能类型”——它可以接收任何值,调用它的时候也不会做任何类型校验:
- 当你把
isString赋值给myEcho时,TypeScript不会检查myEcho的函数签名是否匹配; - 当你用
myEcho("hi")给myInt赋值时,TypeScript也不会校验返回值的boolean类型和myInt的number类型是否兼容,直接允许了这个赋值操作。
运行时的表现:类型注解会被移除
TypeScript编译成JavaScript后,所有的类型注解都会被剥离。所以在运行时,myInt就是一个普通的JavaScript变量,接收isString("hi")返回的true(boolean类型)是完全合法的,这就是为什么控制台会输出true, Type is boolean。
怎么修复?给myEcho指定明确类型
只需要给myEcho加上和isString匹配的函数类型注解,TypeScript就会在编译阶段帮你拦截这个错误:
// 直接指定函数类型 let myEcho: <T>(arg: T) => boolean; myEcho = isString; // 或者用类型别名更清晰 type IsStringFunction = <T>(arg: T) => boolean; let myEcho: IsStringFunction = isString;
这样当你尝试执行myInt = myEcho("hi")时,TypeScript会立刻抛出编译错误:Type 'boolean' is not assignable to type 'number',从根源上避免这种类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Hesam Marshal
相关产品推荐
相关产品推荐

