Расширить строку в TypeScript 3.8 - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу расширить прототип 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, если требуется, но я просто не могу заставить его работать.

1 Ответ

1 голос
/ 21 апреля 2020

Я считаю, что добавление import * as fs from 'fs' заставляет компилятор рассматривать этот файл как модуль. Когда это происходит, Typescript осознает, что в большой программе есть глобальная область действия, на которую может повлиять этот файл, и не допустит путаницы с глобальными прототипами, если вы не скажете, что действительно хотите.

Чтобы явно измените глобальный интерфейс, используйте declare global.

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

Playground

Я бы поместил это в string.d.ts в root моего проекта. Typescript должен взять это и разрешить метод. Просто убедитесь, что импортировали файл, который добавляет эту функцию к фактическому прототипу, прежде чем код, который может его использовать, или вы все равно получите ошибки времени выполнения.

...