Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 接受任何对象作为函数中的参数 我所拥有的_Typescript - Fatal编程技术网

Typescript 接受任何对象作为函数中的参数 我所拥有的

Typescript 接受任何对象作为函数中的参数 我所拥有的,typescript,Typescript,我在一个类中有一个方法,我想接受任何对象作为参数,但我不想使用任何对象,为此我使用泛型和扩展对象 类MyClass{ saveObjectobject:T | null{} } 在此实现中,@typescript eslint/ban types规则会出现以下错误: 不要将“对象”用作类型。“对象”类型当前很难使用,请参见此issuehttps://github.com/microsoft/TypeScript/issues/21732. 考虑使用“记录”,因为它允许您更容易地检查和使用密钥。好

我在一个类中有一个方法,我想接受任何对象作为参数,但我不想使用任何对象,为此我使用泛型和扩展对象

类MyClass{ saveObjectobject:T | null{} } 在此实现中,@typescript eslint/ban types规则会出现以下错误: 不要将“对象”用作类型。“对象”类型当前很难使用,请参见此issuehttps://github.com/microsoft/TypeScript/issues/21732. 考虑使用“记录”,因为它允许您更容易地检查和使用密钥。好的,然后我将收听Eslint并执行以下实现:

类MyClass{ saveObjectobject:T | null{} } 通过上述实现,Eslint错误消失,因此我尝试使用随机对象执行该方法:

MyDepayment中的任何其他方法:IPaymentModel | null:void{ //执行我们的方法 这是一种支付方式; } 但是typescript编译器抛出了一个新错误:

TS2345:类型为“IPaymentModel | null”的参数不能分配给类型为“Record | null”的参数。   类型“IPaymentModel”不可分配给类型“Record”。 类型“IPaymentModel”中缺少索引签名。 一个选项是在传递给方法的参数中使用类型断言,如下所示:

MyDepayment中的任何其他方法:IPaymentModel | null:void{ //使用类型断言执行我们的方法 此项。将付款另存为记录; } 使用上述方法,TS编译器错误将消失,但在执行方法的所有位置都必须执行此类型断言并非最佳选择

我想要什么
我不明白如何接受任何对象作为参数而不出现此类错误,而不需要使用任何对象。

我不完全同意默认配置的前提,默认配置是这样的

避免使用对象类型,因为它目前很难使用,因为无法断言键存在。看

作为提交链接问题的人,我理解尝试使用内置类型保护来获取object类型的值并对其属性做任何有用的事情是痛苦的。如果这个问题得到解决,那就太好了。但是,type对象在TypeScript中以Record不支持的方式表示非原语值。而且,正如你们所注意到的,唱片也有自己的问题,比如。TypeScript有很多陷阱和痛点,对我来说,一个反对一个而支持另一个的笼统建议是不可取的

-

对于这个特定的用例,您可以从object切换到{[k:string]:any},而不是{[k:string]:unknown}。如果进行此更改,将更容易在saveObject中处理值:

我仍然想说,除非object在saveObject的实现中给您带来一些特定的问题,否则禁用该行的linter并使用object是合理的。它比记录更能表达任何非原语。根据linter的说法,不使用对象的假定原因是它很难使用。这是真的;但是它很容易提供,如果您想在更多的地方调用this.saveObject,而不是在您想要实现的地方,我宁愿在实现中做一件烦人的事情,而不是在每个调用站点上做很多烦人的事情


这似乎是对物体的完美运用,不管你的皮棉是怎么告诉你的。我不知道我是否是那个提交文件的人是否重要,但我当然不想暗示那个东西是无用的。如果您实际上不关心使用键对其进行索引,那么21732就不适用。我建议禁用该规则,或者至少抑制该行中的错误。我可以把它写下来作为一个答案,但如果它由于某种原因不能满足您的需求,您能详细说明原因吗?我想知道为什么使用object是一个好的案例,一个带有一些示例的详细答案将帮助我以更安全的方式停用规则,并了解何时使用object以及何时使用Record。
saveObject(obj: Record<string, any> | null) {
  if (obj === null) {
    console.log("nothing to save");
    return;
  }
  if (obj.format === "json") {
    // do something
  }
}
anyOtherMethodInMyCode(payment: IPaymentModel | null): void {
  this.saveObject(payment); // okay
}
otherTests(): void {
  this.saveObject("not an object"); // error!
  this.saveObject(() => 3); // okay, a function is an object
}