为何将泛型收窄为string类型后,无法为泛型变量赋值string值?
TypeScript泛型赋值错误原因解析
核心逻辑:泛型参数T的本质
泛型T extends unknown表示T可以是任意类型,哪怕通过typeof arg === 'string'在运行时收窄了arg的具体值类型,也不代表T本身就是string类型——T是调用者传入的具体子类型,而非当前代码块里的宽泛string类型。
具体场景举例
假设调用者这样使用这个函数:
// 定义一个string的子类型:只能是"hello"或"world" type SpecificString = "hello" | "world"; // 传入符合该子类型的参数,此时T被实例化为SpecificString a<SpecificString>("hello");
在函数内部的if分支里,arg的类型确实是string(更具体的是"hello"),但T的类型是"hello" | "world"。此时你试图把空字符串''赋值给类型为T的b,但''并不属于"hello" | "world"这个集合,这显然是类型不安全的。
TypeScript的预判逻辑
TypeScript的类型检查器会提前识别这种风险:虽然当前分支里arg是string,但T可能是string的某个更严格的子类型,空字符串无法满足所有可能的T的约束。因此它会抛出错误,阻止这种潜在的类型不兼容赋值。
内容的提问来源于stack exchange,提问作者Some People
相关产品推荐
相关产品推荐

