ChatGPT解决这个技术问题 Extra ChatGPT

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

我想在打字稿和角度 10 中使用 replaceAll

但我收到此错误:“字符串”类型上不存在属性“replaceAll”。

这是我的代码:

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

输出:13990608

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

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

b
behroozbc

您应该能够通过 tsconfig.json 添加这些类型。将 "ES2021.String" 添加到 compilerOptions 内的 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 我在答案中添加了一个模板。我的意思是,在你的 tsconfig.json 中添加 ESNext.Stringlib
这消除了 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,不是最新的,但也不是太旧。
Z
Zoe stands with Ukraine

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

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

这并不能“解决问题”。这是替换所有事件的另一种方法。但是如果你想继续使用replaceAll,这并不能解决OP的问题。
这个问题是关于 TypeScript 与 String.replaceAll() 的兼容性,而不是解决方法的请求。
@bokkie 就我而言,它解决了这个问题。我正在使用 react native 并且更改编译器选项实际上并没有更新 javascript,所以这确实是唯一的解决方案。
r
ruth

docs

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

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

可能的未来读者的屏幕截图:

https://i.imgur.com/Ryvn6OL.jpg


如何修复我的打字稿以向我展示此功能?
@behroozbc:AFAIK,replaceAll() 来自 ES2021 规范。如果最新版本的 TS 不支持它,除了使用其他方法之一,您将无能为力。
D
David Ricardo Amaya Rojas

您可以创建一个文件

myOwnTypes.d.ts

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

接口字符串 { 替换所有(输入:字符串,输出:字符串):任何; }

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

现在在 Chrome 和 Firefox 中都支持 replaceAll,但检查 caniuse 以检查它是否符合您的需求总是很好的。

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

如果这对您有用,那么欢迎投票,我从这个 stackoverflow 帐户开始,并感谢您的支持:)


M
Mansour Alnasser

只需使用此功能

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


这是我解决问题的第一个想法,但我确信有更有效的方法。使用正则表达式似乎是要走的路
提出的问题是“如何修复我的打字稿以向我展示此功能?”。一个有效的答案显然不是“改用我的函数”,当有一个明确的答案时更是如此(修复 ES 版本):)
N
Nathan Arthur

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

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

请不要建议使用any
更改为 any 不是解决方案!
F
Farhan Kassam

根据 MDN 网络文档,

“要执行全局搜索和替换,请在正则表达式中包含 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