试图通过 suppressExcessPropertyErrors 编译器选项来抑制 TS2339

Posted

技术标签:

【中文标题】试图通过 suppressExcessPropertyErrors 编译器选项来抑制 TS2339【英文标题】:Trying to suppress TS2339 by suppressExcessPropertyErrors compiler option 【发布时间】:2017-07-12 01:40:54 【问题描述】:

代码如下:

var x = ;
x.test = 'abc';

得到打字稿编译器错误:

TS2339:类型“”上不存在属性“test”。

我想取消对对象文字的此警告,我想将 suppressExcessPropertyErrors 放入 tsconfig.json 应该可以解决此问题。

tsconfig:


    "compilerOptions": 
        "suppressExcessPropertyErrors": true
    ,
    ...

但没有任何改变..编译器仍然显示错误。

感谢您的任何提示;)

【问题讨论】:

【参考方案1】:

我想将 suppressExcessPropertyErrors 放入 tsconfig.json 应该可以解决这个问题。

没有。它抑制了对象构造中的多余属性,例如

var x = ;
x = test:'abc';

我想取消对对象字面量的警告

您可以使用 any 类型做任何您想做的事情,例如

var x:any = ;
x.test = 'abc';

更多

这称为 惰性对象初始化,这里介绍了处理它的模式:https://basarat.gitbook.io/typescript/main-1/lazyobjectliteralinitialization

【讨论】:

感谢您的回答,我之前已经找到“任何”解决方案,但我正在寻找更通用的解决方案,使用配置标志将是最好的。我认为 /read 打字稿是“可选的”超集,所以旁边有“你可以使用标准 js”。但是这个案例表明它似乎不是真的。 @basarat 给这个答案加了我的 5 美分 @Luckylooke 当然可以!除了三个小东西(枚举、命名空间和一个晦涩的特殊 import= 语法)之外,如果你删除了类型注释,你就剩下纯 ECMAScript。你必须添加类型,或者在某些地方使用 any 类型专门关闭时间,这就是你首先选择 TypeScript 的原因!添加类型然后转身抱怨你想关闭它们有什么意义?然后不要添加任何东西!在这种情况下,您没有使用 TypeScript,“只是 JS”! @basarat - 你的答案,包括。链接,缺少性能方面。关键字“隐藏类”,例如在 V8 中。每当对象的属性在内部发生变化时,JS 运行时会决定“这是一个新的对象类”,并创建一个新的内部元结构来表示对象及其属性。因此,如果您从一个空对象开始并逐个添加 n 属性,那么您最终会得到该对象的 n+1 内部表示,它们彼此不兼容(对于内部运行时优化变得很重要)。 @Luckylooke 准确地说,不知何故,每个天才都认为打字稿项目总是从头开始制作的。好吧,我正在将 2014 年的旧节点服务器移植到打字稿,并且能够在全球范围内抑制大量类型错误会很好。【参考方案2】:

在某些方面我可以同意 @basarat,但也请允许我补充一些建议。

这样的声明对象道具可能有几个原因:

var x = 
  test: ''
;
x.test = 'abc';
    您将获得智能感知支持,并且在下次调用 x 对象时,您将看到该对象包含哪些属性。 适合测试。您将确保对象的构造不会在项目中的某个地方发生更改,并且可以在编写测试时牢记这一点。 您将避免用新的属性覆盖您的对象属性。如果您将对象声明为 any 类型,则可能是这样。

解释

// origin object x with originProp property
var x: any = 
  originProp: 'abc'
;
// new object with new newProp property
x = 
  newProp:'abc'
;

【讨论】:

有时我需要将多个数据合并到一个对象中以进行 REST API 请求,然后我想使用对象字面量。一切都很好,直到你需要一些属性的条件.. 输入“任何”可以解决问题,但我认为打字稿是可选的,所以恕我直言,它不应该将我推入“任何”解决方案..并且所有未指定的对象都应该是类型默认为“任何”。

以上是关于试图通过 suppressExcessPropertyErrors 编译器选项来抑制 TS2339的主要内容,如果未能解决你的问题,请参考以下文章

试图让循环通过备用数组工作

试图通过网络提供商获得纬度和纬度

试图通过 EAX 左移一个变量

我不明白 liquibase diff 试图通过这些选择来确定啥?

试图通过javascript从音频文件中获取分贝级别

Python:试图通过电子邮件发送附件〜字符串错误?