Angular 5项目TypeScript报错:无法调用字符串方法求助
解决Angular 5 + TypeScript中字符串
contains()方法的类型错误 我帮你搞定这个问题,这种情况在Angular结合TypeScript的项目里真的挺常见的,核心问题其实是**contains()并不是标准的JavaScript字符串方法**——TypeScript严格遵循ECMAScript标准,而contains()只是旧版Firefox的私有实现,ES标准里对应的官方方法是includes()。
为什么typeof显示是字符串还报错?
虽然在某些JS运行环境里可能能跑contains(),但TypeScript的全局类型定义文件(lib.d.ts)里并没有给String原型添加这个方法的类型声明,所以TS编译器会直接判定这个方法不存在,抛出类型错误,哪怕你用typeof检测到两边都是字符串也没用——编译器只认类型定义,不认运行时的实际值。
快速修复方案(推荐)
直接把所有调用contains()的地方替换成标准的includes()就好了,它的功能和你预期的contains()完全一致:检查一个字符串是否包含指定子串,还支持可选的起始搜索位置参数。
错误写法(触发TS错误):
// 这里会报"Property 'contains' does not exist on type 'string'" if (candidate.name.contains(inputValue)) { // 你的业务逻辑 }
正确写法(符合TS标准):
// 完全兼容TypeScript,无类型错误 if (candidate.name.includes(inputValue)) { // 你的业务逻辑 }
如果你非要用contains()(不推荐)
如果因为某些历史原因必须保留contains()调用,可以通过扩展TypeScript的类型定义来解决:
- 在项目根目录创建一个类型声明文件,比如
string-extensions.d.ts - 写入以下内容:
interface String { contains(searchString: string, position?: number): boolean; }
- 确保你的
tsconfig.json里的include数组包含这个文件,比如:
{ "include": [ "src/**/*", "./string-extensions.d.ts" ] }
不过还是强烈建议用标准的includes(),避免后续的浏览器兼容性问题。
旧浏览器兼容补充
如果你的项目需要兼容IE这类旧浏览器,includes()需要polyfill支持。在Angular CLI项目里,直接在src/polyfills.ts里添加以下代码即可:
import 'core-js/es7/string';
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

