TypeScript泛型用String/string时传入数字数组未报错相关问题咨询
问题1解答
你对代码的行为存在语法层面的误解,核心问题并非大写String和原始类型string的差异:
你写的 <String> 是泛型形参的名称声明,而非对泛型的类型约束。相当于你把通用泛型写法中常用的形参名T换成了String,这个位置的String会被TypeScript识别为局部的泛型形参,直接覆盖全局的String接口类型。
// 你的写法等价于下面的代码,只是把T改成了叫String的名字 function identity<T>(arg: T): T { return arg; }
当你调用identity([2])时,TypeScript会自动根据入参[2]推导出泛型形参的实际类型是number[],完全符合类型规则,因此不会抛出任何错误。
如果你确实需要约束泛型必须为String类型,正确的泛型约束写法是:
function identity<T extends String>(arg: T): T { return arg; }
这种写法下传入[2]就会触发类型错误。
问题2解答
你把泛型形参名替换为小写string后,依然是将string作为泛型形参的名称,覆盖了TypeScript内置的原始类型string,触发报错的原因如下:
- 小写
string是TypeScript的内置类型关键字,使用关键字作为泛型形参名属于不规范命名,类型检查时会优先识别到内置的string类型,判定你声明的局部泛型形参string未被正确使用 - 如果你的TS配置开启了
noUnusedTypeParameters检查规则,会检测到你声明的泛型形参既没有用于类型约束、也没有手动指定传入类型,因此抛出未使用的报错。
如果你要实现入参返回值均为string类型的函数,不需要使用泛型,直接指定类型即可:
function identity(arg: string): string { return arg; }
如果要实现通用的泛型 identity 函数,使用无歧义的T作为泛型形参名即可:
function identity<T>(arg: T): T { return arg; }
内容的提问来源于stack exchange,提问作者PDHide
相关产品推荐
相关产品推荐

