“字符串”类型上不存在属性“replaceAll”

Posted

技术标签:

【中文标题】“字符串”类型上不存在属性“replaceAll”【英文标题】:Property 'replaceAll' does not exist on type 'string' 【发布时间】:2020-12-16 08:48:06 【问题描述】:

我想在 typescript 和 angular 10 中使用replaceAll

但我收到此错误:

这是我的代码:

let date="1399/06/08"
console.log(date.replaceAll('/', '_'))

输出:13990608

如何修复我的打字稿以显示此功能?

【问题讨论】:

TypeScript 无法神奇地添加浏览器未实现的功能。您需要实现Michael D's answer 中的链接问题中提到的替换方法之一。 date.split('/').join('_') 您现在可以使用它。虽然你可以更新到 chrome85。 我想在vscode中使用我在vscode中有这个错误 @behroozbc 你可以试试最新的打字稿版本。 【参考方案1】:

您可以使用 RegExp 和 global flag 解决问题。全局标志是使 replace 在所有事件中运行的原因。

"1399/06/08".replace(/\//g, "_") // "1399_06_08"

【讨论】:

这并不能“解决问题”。这是替换所有事件的另一种方法。但是如果你想继续使用replaceAll,这并不能解决OP的问题。 这个问题是关于 TypeScript 与 String.replaceAll() 的兼容性,而不是请求解决方法。【参考方案2】:

您应该能够通过您的tsconfig.json 添加这些类型。 在compilerOptions 中添加"ES2021.String"lib

您的 tsconfig 应如下所示:


    ...,
    "compilerOptions": 
        ...,
        "lib": [
          ...,
          "ES2021.String"
        ]
    

replaceAll 方法在lib.es2021.string.d.ts 内部定义如下:

interface String 
    /**
     * Replace all instances of a substring in a string, using a regular expression or search string.
     * @param searchValue A string to search for.
     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.
     */
    replaceAll(searchValue: string | RegExp, replaceValue: string): string;

    /**
     * Replace all instances of a substring in a string, using a regular expression or search string.
     * @param searchValue A string to search for.
     * @param replacer A function that returns the replacement text.
     */
    replaceAll(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;

【讨论】:

找到lib.esnext.string.d.ts 文件,这些函数在您的代码中声明不知道“通过您的 tsconfig.json 添加这些类型”是什么意思,您能否详细说明 @KukulaMula 我在答案中添加了一个模板。我的意思是,将ESNext.String 添加到lib 内部tsconfig.json 这消除了 lint 错误,但是当我尝试运行时,我收到一条错误消息:An unhandled exception occurred: tsconfig.json:21:7 - error TS6046: Argument for '--lib' option must be: 'es5', 'es6', 'es2015',...,其中包含一长串选项,但它们都不是ESNext.String,并且无法编译。 @StackUnderflow 可能你的 TS 版本太低了,相信是 TS 2.4 中加入的,跟这个commit @Josef 我的是 3.8.3,不是最新的,但也不是太旧。【参考方案3】:

根据 MDN Web Docs,

"要执行全局搜索和替换,请将g 开关包含在 正则表达式”。

所以,你可以试试:

const date="1399/06/08"
const forwardSlashRegex = /(\/)/g;
console.log(date.replace(forwardSlashRegex, '_'));

这会自动将所有正斜杠替换为下划线。确保还在正则表达式末尾保留/g 全局指示符,因为它允许 JS 知道您要替换所有出现正斜杠的位置。

有关使用正则表达式指标的更多信息,请参阅以下非常有用的指南:https://developer.mozilla.org/en-US/docs/Web/javascript/Guide/Regular_Expressions

【讨论】:

【参考方案4】:

你可以创建一个文件

myOwnTypes.d.ts

在你的 Angular 项目的根目录下并添加以下代码:

interface String 
    replaceAll(input: string, output : string): any;

这将告诉 typescript 字符串具有此属性。

现在 Chrome 和 Firefox 支持 replaceAll,但最好检查一下 caniuse 是否符合您的需求。

https://caniuse.com/?search=replaceAll

如果这对你有用,欢迎投票,我从这个 *** 帐户开始,希望得到支持:)

【讨论】:

【参考方案5】:

Chrome 支持 replaceAll,因此可以安全使用。但是 typescript 仍然会出现错误,因此您可以将字符串转换为任何字符串,以克服该障碍。

const date: any ="1399/06/08"
console.log(date.replaceAll('/','_'))

【讨论】:

请不要使用any 改成any不是解决办法!!!【参考方案6】:

只需使用此功能

    let date="1399/06/08"
    
    console.log(date.split('/').join('_'))

【讨论】:

这是我解决问题的第一个想法,但我确信有更有效的方法。使用正则表达式似乎是要走的路【参考方案7】:

来自docs:

截至 2020 年 8 月,Firefox 支持 replaceAll() 方法,但 不是通过 Chrome。它将在 Chrome 85 中可用。

同时您可以找到多种其他方法here。

未来可能读者的截图:

【讨论】:

如何修复我的打字稿以显示此功能?? 另见caniuse.com/#feat=mdn-javascript_builtins_string_replaceall @behroozbc:AFAIK,replaceAll() 来自 ES2021 规范。如果最新版本的 TS 不支持它,你只能使用其他方法之一。

以上是关于“字符串”类型上不存在属性“replaceAll”的主要内容,如果未能解决你的问题,请参考以下文章

TS2339:联合类型上不存在属性 - 属性字符串 |不明确的

错误 TS2339:“字符串”类型上不存在属性“endsWith”

打字稿推断出不正确的类型:TS2339 属性“选定”在类型“字符串”上不存在

类型“typeof ...”上不存在属性“use”,类型“typeof”上不存在属性“extend”

TypeScript:类型“”上不存在属性

错误 TS2339:类型“”上不存在属性“包含”