繁体   English   中英

是什么导致 VS 不允许我使用 TypeScript 扩展内置类型

[英]What is causing VS to not allow me to extend built-in types with TypeScript

我已经看到了这个问题和其他类似的帖子,甚至在TS playground中完成了我想要的,但是在 VS 中我得到红色下划线并构建错误。

在此处输入图像描述 在此处输入图像描述

错误 txt: Error TS2339 Build:Property 'contains' does not exist on type 'String'.

我缺少一些配置吗?

编辑以说明评论:

在此处输入图像描述

关于你的第一个错误

TS2339 构建:“字符串”类型上不存在属性“包含”

确保在全局 scope 中扩展String接口,而不是在模块文件中。 这意味着,文件顶层可能没有任何exportimport

interface String {
    foo(): void
}

String.prototype.foo = () => { console.log("bar") }

"aksljflasd".foo()

操场

您还可以在模块文件中使用declare global

export {}

declare global {
    interface String {
        foo(): void
    }
}

"aksljflasd".foo()

操场

关于第二个错误

“字符串”类型上不存在属性includes

String.prototype.includes至少需要ES6 因此,您的target很可能是tsconfig.json中的ES5或更低版本。 此外,当您手动设置lib选项时,请确保包含ES2015.Core

操场

这取决于您的项目 tsconfig 文件。 这是完整的规范 - tsconfig 仔细看看 --lib 选项。 通常,为了具有来自不同 ECMAScript 规范的功能,需要在其中进行定义。

看看同样的问题 -字符串中没有包含 所以看起来编译需要添加 es2016 lib(或更新的规范):

{
    "compilerOptions": {
          // other options
          "lib": [
            "es2019" // any above or equal es2016
          ]
    },

您发布的示例一直有效,直到您使用它制作es6模块。 尝试在操场文件中的某处使用exportimport并观察错误弹出。

恕我直言,最干净的解决方案是将 String 接口声明移动到 *.d.ts 文件中,并将其包含在 typescript 编译中。 我将文件放入任意 /types 文件夹并在我的 tsconfig.json 中使用"include": ["types"]以便它被拾取。 然后你可以在你喜欢的任何地方在你的代码中执行实际的扩展String.prototype.contains =...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM