Расширение встроенных типов в Typescript - PullRequest
2 голосов
/ 07 октября 2019

У меня следующая структура:

project
 |- types
    |- global.d.ts
    |- string.d.ts
    |- wdio.d.ts
 |- src
    |- Models
    |- Resources
    |- Components
    |- Extensions
       |- string.ts
    |- ...
 |- tsconfig.json
 |- wdio.conf.js

Я пытаюсь расширить прототип строки с помощью функции. Я много пробовал, нашел на нескольких сайтах. Но либо tsc выдает ошибку, либо PHPStorm показывает сообщение об ошибке.

// types/string.d.ts
declare interface String {
    myCustomFn(text : string) : string;
}

// src/Extensions/string.ts
String.prototype.myCustomFn = function(text : string) : string {
    // ... Logic

    return 'myCustomFn';
};

// tsconfig.json
...
    "typeRoots": ["./types/"],

    "include": [
      "./src/**/*.ts",
      "./types"
    ]
...

// wdio.conf.js
...
before: function (capabilities, specs) {
    require('ts-node').register({ files: true });

    require('../extensions/String');
},
...

Я добавил расширение для класса String в файл d.ts. Затем я определяю тело функции в отдельном файле. Когда я внедряю его в файл src/Extensions/string.ts, команда tsc не выдает сообщения об ошибке, НО PHMStorm показывает следующую ошибку:

TS2339: Property 'myCustomFn' does not exist on type 'String'.

Более того, в любом месте кодаавтозаполнение показывает мой метод, и даже код может быть выполнен, и использует функцию myCustomFn.

Вопросы:

  • Это просто ошибка IDE?
  • Я что-то не так делаю или должен, какКласс String расширяется по-другому?

1 Ответ

1 голос
/ 07 октября 2019

Полный рабочий пример для Github

Поместите расширение String в произвольный файл .d.ts:

interface String {
  myCustomFn(text : string) : string;
}

Добавьте другой файл extension.tsгде вы добавляете prototype:

String.prototype.myCustomFn = function(text : string) : string {
  return 'myCustomFn';
};

Затем импортируйте файл extension.ts в корневой файл index.ts:

import './extension';

Теперь вы можете добавлять String().myCustomFn(text: string); вездеВы хотите.

PS важно, чтобы вы включили файл .d.ts в файлы компиляции. Свойство typeRoots необязательно.

tsconfig.json:

{
  "compilerOptions": {
    "outDir": "dist"
  },
  "include": [
    "src",
    "types" // here is the .d.ts file
  ],
  "exclude": [
    "**/node_modules"
  ]
}

...