【问题标题】:Extend String in TypeScript 3.8在 TypeScript 3.8 中扩展字符串
【发布时间】:2020-04-21 19:30:01
【问题描述】:

我想要扩展String 原型以添加.trimSlashes() 方法来擦除字符串两端的斜线;我不能让它进行就地替换(而不是要求返回一个字符串,只需在调用时更改自己的字符串),但这将是另一个问题。

我使用的是 TypeScript 3.8.3 版。

所以我有这个 trimSlashes.ts 文件:

import * as fs from "fs";

interface String {
  trimSlashes(this: string) : string;
}

String.prototype.trimSlashes = function (this : string) : string {
  var str = this;
  if (str.startsWith("/")) {
    str = str.replace(/^\/+/, "")
  }
  if (str.endsWith("/")) {
    str = str.replace(/\/+$/, "");
  }

  return str;
}

let test = "//myTest/";

console.log("Original string: " + test);
test.trimSlashes();

console.log("Trimmed slashes: " + test);

console.log("File or directory exists: " + fs.existsSync(test));

我添加了fs 上下文,因为它需要触发编译器停止解析并抱怨Property 'trimSlashes' does not exist on type 'String'. 的错误。如果没有 fs 代码,它会在 NodeJS 上构建和运行。

补充说明

有几个这样的问题,但似乎没有人要求 3.8 版,而且我能找到的所有答案都不适用。

我尝试创建一个单独的 .d.ts 文件,将其包含在源代码中,现在我正在尝试我认为最简单的方法:在一个文件中声明所有内容。如果需要,我不介意有一个 .d.ts 文件,但我就是无法让它工作。

【问题讨论】:

    标签: typescript extension-methods


    【解决方案1】:

    我相信添加import * as fs from 'fs' 会强制编译器将该文件视为一个模块。当这种情况发生时,Typescript 会意识到在一个更大的程序中存在一个可能受此文件影响的全局范围,并且不会让全局原型混乱,除非你告诉它你真的打算这样做。

    要显式修改全局接口,请使用declare global

    declare global {
      interface String {
        trimSlashes(this: string): string;
      }
    }
    

    Playground

    我会把它放在我项目根目录的string.d.ts 中。打字稿应该选择它并允许该方法。只需确保在任何可能使用它的代码之前导入将该函数添加到实际原型的文件,否则您仍然会遇到运行时错误。

    【讨论】:

    • 感谢您的建议。不幸的是,仅仅创建一个string.d.ts 并添加declare global 块是行不通的。我可以使用它的唯一方法是复制粘贴文件中的整个块。知道如何强制它找到string.d.ts,它与trimSlashes.ts 文件位于同一文件夹中吗? (旁注:你的回答解决了这个问题;这只是你的建议——我完全同意并希望能够使用——似乎没有加起来)
    • 这个东西可能找不到,因为我使用noImplicitAny: true,我有点想控制什么进入或不进入,即使我需要明确包含 .d.ts 文件......如果这有意义...
    • 好吧,我想通了。简而言之:(a) string.d.ts 中没有declare global,(b) 定义trimSlashes() 扩展的utils.ts,(c) 我的“客户端代码”使用import * as util from "./utils";导入。
    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多