Typescript 接受任何对象作为函数中的参数 我所拥有的
我在一个类中有一个方法,我想接受任何对象作为参数,但我不想使用任何对象,为此我使用泛型和扩展对象 类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编译器错误将消失,但在执行方法的所有位置都必须执行此类型断言并非最佳选择 我想要什么Typescript 接受任何对象作为函数中的参数 我所拥有的,typescript,Typescript,我在一个类中有一个方法,我想接受任何对象作为参数,但我不想使用任何对象,为此我使用泛型和扩展对象 类MyClass{ saveObjectobject:T | null{} } 在此实现中,@typescript eslint/ban types规则会出现以下错误: 不要将“对象”用作类型。“对象”类型当前很难使用,请参见此issuehttps://github.com/microsoft/TypeScript/issues/21732. 考虑使用“记录”,因为它允许您更容易地检查和使用密钥。好
我不明白如何接受任何对象作为参数而不出现此类错误,而不需要使用任何对象。我不完全同意默认配置的前提,默认配置是这样的 避免使用对象类型,因为它目前很难使用,因为无法断言键存在。看 作为提交链接问题的人,我理解尝试使用内置类型保护来获取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
}