【问题标题】:Typescript assign 'Object' a specific type instead of 'any'打字稿为“对象”分配特定类型而不是“任何”
【发布时间】:2021-03-17 21:02:15
【问题描述】:

由于 --strict_checks 和 typescript eslint 检查,我正在尝试修复我的代码中的一些新错误。下面的代码示例用于我解释的所有内容。假设我有一个对象 a,我想直接将其指定为地图以解决一些错误。我不能使用关键字“任何”。这就是我想要做的:

isEquivalent(a: Object, b: Object): boolean {
   const aObject: {[index: string]: Object} = a;
   const bObject: {[index: string]: Object} = b;
}

使用实际代码 sn-p 链接到 typescript playground:here 但这会引发错误:

错误 TS2322:类型 'Object' 不可分配给类型 '{ [index: string]: Object; }'。 “对象”类型可分配给极少数其他类型。您的意思是改用“任何”类型吗? “对象”类型中缺少索引签名。

谁能指出我指定对象的类型的解决方案,而不使用“任何”?或者如果这不可能,请告诉我。

【问题讨论】:

  • 进行了您要求的更改。

标签: typescript eslint


【解决方案1】:

const aObject: {[index: string]: Object} = a;aObject 类型)分配给aObject{[index: string]: Object} 类型,一个具有字符串属性名称和Object 属性值的对象)。但是 Object{[index: string]: Object} 的赋值不兼容,所以 TypeScript 会给你这个错误。

如果你想强制它,你可以做一个type assertion

const aObj = a as {[index: string]: Object};

Updated playground link

请注意,类型断言大多会禁用 TypeScript 的类型检查。调用者可以传入{a: 42},它不是{[index: string]: Object},TypeScript 会允许它,因为你说参数只是Object,但是你把它当作@ 987654335@.

有时这是合适的,但您可以考虑为参数指定类型{[index: string]: Object},而不是在函数中使用类型断言。这样,TypeScript 可以确保只传入正确类型的对象。

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2022-08-18
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2021-10-11
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多