typescript 类型“string”上不存在属性“replaceAll”

3phpmpom  于 2022-12-19  发布在  TypeScript
关注(0)|答案(9)|浏览(588)

我想在 typescript 和Angular 10中使用replaceAll
但我得到这个错误:* * 类型"string"上不存在属性"replaceAll"**。
这是我的代码:

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

输出:13990608
怎样才能把我的 typescript 修改成显示这个功能?

ff29svar

ff29svar1#

你应该可以通过你的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;
}
jgovgodb

jgovgodb2#

你可以使用RegExp和global flag来解决这个问题。global flag是让replace在所有情况下运行的标志。

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

juzqafwq3#

docs
截至2020年8月,replaceAll()方法在Firefox中得到支持,但在Chrome 85中不支持。
同时,您可以找到多个其他方法here
供未来读者参考的截图:

q35jwt9p

q35jwt9p4#

仅使用此功能

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

3z6pesqy5#

您可以创建文件
myOwnTypes.d.ts
在Angular 项目的根目录下,添加以下代码:

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

这将告诉typescript字符串具有这个属性。
现在Chrome和Firefox支持replaceAll,但是检查一下caniuse是否符合你的需要总是很好的。
https://caniuse.com/?search=replaceAll
如果这对你有效,upvotes是非常受欢迎的,我从这个stackoverflow帐户开始,并将感谢支持:)

h9vpoimq

h9vpoimq6#

Chrome支持replaceAll,所以使用起来很安全。但是typescript仍然会发出错误,所以你可以将你的字符串强制转换为any,以克服这个障碍。

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

kjthegm67#

这是因为TypeScript不能识别比当前JavaScript版本更新的方法。String.replaceAll()定义为ES2021。
您必须将lib添加到tsconfig.json文件的compilerOptions中。
lib的值必须为:["ES2021"],或者具体地说,字符串类型为["ES2021.String"]
tsconfig.json文件中添加以下内容:

{
  ...
  "compilerOptions": {
    "lib": ["ES2021"]
  ...
}
2nc8po8w

2nc8po8w8#

根据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

jm81lzqq

jm81lzqq9#

如果有人仍然有这个问题,请将其添加到您的tsconfig.json

{
    ...,
    "compilerOptions": {
        ...,
        "lib": [
          ...,
          "esnext.string"
        ]
    }
}

相关问题