题目 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 extends string ? true : false;
type A = IsString<"hello">; // A 的类型?
type B = IsString; // 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 实时验证类型推断结果。