第十节 高频代码题-类型推断题
⚙️ 一、基础类型推断题
题目 1:变量初始化推断
let a = 42;
const b = "hello";
let c = true;
答案与解析:
a
被推断为number
(let
声明允许重新赋值为同类型数字)b
被推断为字面量类型"hello"
(const
声明固定值,无类型拓宽)c
被推断为boolean
(基础类型推断)
🧩 二、复合类型推断题
题目 2:数组与对象推断
const arr = [1, "text", null];
const obj = { name: "Alice", score: 95
};
答案与解析:
arr
被推断为(number | string | null)[]
- 最佳公共类型:自动推导兼容所有元素的联合类型
obj
被推断为{ name: string; score: number }
- 对象字面量推断:根据属性初始值精确推导类型
🔄 三、函数类型推断题
题目 3:函数参数与返回值推断
const add = (a: number, b: number) => a + b;
const users = ["Alice", "Bob"].map(user => user.toUpperCase());
答案与解析:
add
返回值被推断为number
(表达式a + b
操作数均为number
)users
被推断为string[]
- 回调函数
user => user.toUpperCase()
中:user
根据数组元素推断为string
(上下文类型推断)- 返回值
user.toUpperCase()
返回string
- 回调函数
🎯 四、上下文类型推断题
题目 4:事件处理器参数推断
window.addEventListener("click", e => {console.log(e.clientX);
});
答案与解析:
e
被推断为MouseEvent
- 上下文驱动:根据
addEventListener
的泛型签名自动匹配事件类型 - 无需显式声明,避免冗余类型注解
- 上下文驱动:根据
⚖️ 五、联合类型与字面量题
题目 5:联合类型与字面量收缩
let value: number | string = Math.random() > 0.5 ? 42 : "42";if (typeof value === "string") {value.toUpperCase(); // 此处 value 类型是什么?
}
答案与解析:
- 外层
value
被推断为number | string
(联合类型) if
块内被收窄为string
- 控制流分析:
typeof
守卫触发类型收窄 - 可安全调用
.toUpperCase()
(仅string
可用)
- 控制流分析:
💡 六、进阶技巧题
题目 6:泛型推断与条件类型
type IsString<T> = T extends string ? true : false;
type A = IsString<"hello">; // A 的类型?
type B = IsString<number>; // B 的类型?
答案与解析:
A
被推断为字面量类型true
B
被推断为字面量类型false
- 条件类型分发:根据
T
是否满足extends string
返回不同字面量
- 条件类型分发:根据
✅ 高频考点总结
场景 | 核心规则 | 典型题号 |
---|---|---|
变量初始化 | let 拓宽类型,const 不拓宽 | 1 |
数组/对象推断 | 最佳公共类型 + 属性推导 | 2 |
函数上下文 | 参数/返回值表达式推断 + 上下文类型 | 3, 4 |
类型收窄 | typeof /instanceof 守卫 | 5 |
泛型与条件类型 | 类型分发 + 字面量返回 | 6 |
💡 避坑指南:
- 空数组初始化
let arr = []
会推断为any[]
(需显式注解)- 函数无返回值时推断为
void
(非undefined
)- 启用
strictNullChecks
后,未初始化变量可能推断为undefined
深入练习可参考 TypeScript Playground 实时验证类型推断结果。