Angular中如何将泛型传入其他函数并正确标注参数类型?
解决方案
以下是不同场景下的可用解决方法:
方案1:直接使用类型断言(适合100%确定运行时value一定是字符串的场景,写法最简单)
调整doSomething的代码即可:doSomething<T>(value: T): any { // 两层断言先转unknown再转string,规避TS的类型兼容校验 return (value as unknown as string).replace(/\s/g, ''); }方案2:增加类型校验收窄类型(安全性最高,可避免非字符串值调用
replace引发的运行时异常)
通过类型判断让TS自动识别变量类型:doSomething<T>(value: T): any { if (typeof value === 'string') { // 进入该分支时TS会自动判定value为string类型,可直接调用replace return value.replace(/\s/g, ''); } // 可根据业务需求补充非字符串场景的兜底逻辑,无需求直接返回value即可 return value; }方案3:调用
doSomething时指定泛型并断言参数
调整getSomething中的调用逻辑:getSomething<T>(value: T): any{ // 确定此时value是字符串,调用时显式指定泛型为string同时断言参数 const temp = this.doSomething<string>(value as unknown as string); // ... 其余原有逻辑 }方案4:给泛型增加类型约束(适合
getSomething传入的参数本身就只能是字符串的场景)
直接约束泛型的范围,不需要任何断言即可完全符合TS类型规范:// 约束T必须是string类型 getSomething<T extends string>(value: T): any{ const temp = this.doSomething<T>(value); // ... 其余原有逻辑 } doSomething<T extends string>(value: T): any { return value.replace(/\s/g, ''); }
内容的提问来源于stack exchange,提问作者Domiku
相关产品推荐
相关产品推荐

