打字稿和正则表达式

Posted

技术标签:

【中文标题】打字稿和正则表达式【英文标题】:TypeScript and RegExp 【发布时间】:2013-01-16 23:37:59 【问题描述】:

TypeScript 说:

(pattern: string, flags?: string): RegExp; new(pattern: string, flags?: string): RegExp; ”类型的值上不存在属性“$1

可以通过查看 TypeScript 0.8.2 中来自 lib.d.ts 的定义来解释该类型:

interface RegExp 
    /** 
      * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.
      * @param string The String object or string literal on which to perform the search.
      */
    exec(string: string): RegExpExecArray;
    /** 
      * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
      * @param string String on which to perform the search.
      */
    test(string: string): bool;
    /** Returns a copy of the text of the regular expression pattern. Read-only. The rgExp argument is a Regular expression object. It can be a variable name or a literal. */
    source: string;
    /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */
    global: bool;
    /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */
    ignoreCase: bool;
    /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */
    multiline: bool;

    lastIndex: number;

declare var RegExp: 
    new (pattern: string, flags?: string): RegExp;
    (pattern: string, flags?: string): RegExp;

我的问题是如何更改/更新它以允许我引用 RegExp.$1RegExp.$2 等?最好是我可以单独声明的东西,因为我不打算直接编辑lib.d.ts(它很可能会在更新时被替换)

我试过没有用:

declare var RegExp: 
    new (pattern: string, flags?: string): RegExp;
    (pattern: string, flags?: string): RegExp;
    $1: any;
    $2: any;
    $3: any;
    $4: any;
    $5: any;
    $6: any;
    $7: any;
    $8: any;
    $9: any;    

我想它们实际上应该用string 类型声明。但无论如何它都不会消除错误。

除此之外,我也很好奇这到底意味着什么(为什么它声明时有new?):

new (pattern: string, flags?: string): RegExp;
(pattern: string, flags?: string): RegExp;

【问题讨论】:

【参考方案1】:

您的declare var 已关闭。接口是开放的,所以你可以写:

interface RegExp 
    $1: string;
    $2: string;
    // etc

关于第二个,这是因为new RegExp('[A-Z]')RegExp('[A-Z]') 都可以创建RegExp(在类型方面,它既是可调用函数又是构造函数)。

【讨论】:

它给了我“重复标识符'$1'” 这是 Visual Studio 中的一个错误 - 您仍然可以正常编译。这将在未来的版本中得到修复;见typescript.codeplex.com/workitem/176 虽然没有解决原始错误。仍然说属性$1等不存在 这对我有用:interface RegExp $1: string; 变量 x = /[A-Z]/; console.log(x.$1); 嗯。这对我不起作用。我将制作一个包含该文件的文件,并在有机会时对其运行node tsc.js(但现在是下午 5 点,所以必须等待)

以上是关于打字稿和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:如何在 2 行中编写长正则表达式 [重复]

在打字稿中应用正则表达式

正则表达式测试作为属性的指令实现错误 - 验证(打字稿+角度)

此正则表达式方言不支持条件

使用正则表达式的 SQLite 查询

求JS中如何匹配字母、数字和空格的正则表达式