最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Extending built-in types in Typescript - Stack Overflow

programmeradmin3浏览0评论

I have the following structure:

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

I try to extend the string's prototype with a function. I tried so far a lot of way, I found on several sites. But either the tsc gives me error, or the PHPStorm shows error message.

// 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');
},
...

I added the augmentation for the String class to the d.ts file. Then I define the body of the function in a separate file. When I implement it in the src/Extensions/string.ts file, the tsc mand gives no error message, BUT the PHPStorm shows the following error:

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

Moreover, anywhere in the code the auto-pletition shows my method, and even the code can be executed, and uses the myCustomFn function.

Questions:

  • Is this just an error of the IDE?
  • Am I doing something wrong or should the way, how the String class is being extended be in different way?

I have the following structure:

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

I try to extend the string's prototype with a function. I tried so far a lot of way, I found on several sites. But either the tsc gives me error, or the PHPStorm shows error message.

// 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');
},
...

I added the augmentation for the String class to the d.ts file. Then I define the body of the function in a separate file. When I implement it in the src/Extensions/string.ts file, the tsc mand gives no error message, BUT the PHPStorm shows the following error:

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

Moreover, anywhere in the code the auto-pletition shows my method, and even the code can be executed, and uses the myCustomFn function.

Questions:

  • Is this just an error of the IDE?
  • Am I doing something wrong or should the way, how the String class is being extended be in different way?
Share Improve this question edited Oct 7, 2019 at 12:06 a1300 2,8232 gold badges16 silver badges19 bronze badges asked Oct 7, 2019 at 8:33 Zoltán FeketeZoltán Fekete 6141 gold badge10 silver badges26 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 8

Full working example on Github

Place your String interface extension in a random .d.ts file:

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

Add another file extension.ts where you add the prototype:

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

Then import the extension.ts file into your root index.ts file:

import './extension';

Now you can add your String().myCustomFn(text: string); everywhere you want.


P.S. it is important that you include the .d.ts file to your pilation files. The typeRoots property is not necessary.

tsconfig.json:

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

发布评论

评论列表(0)

  1. 暂无评论