gpt4 book ai didi

javascript - 如何确定 typescript 中可能具有字符串和数字索引的对象类型?

转载 作者:行者123 更新时间:2023-12-03 02:08:23 25 4
gpt4 key购买 nike

我的函数可以处理数组和对象。对象具有字符串类型的键,数组具有数字类型的键。也可以有没有键的对象。

我确定两个接口(interface)和一种类型:

interface IObjectStringKey {
[key: string]: any
}
interface IObjectNumberKey {
[key: number]: any
}
// object with key-string, key-number or without key
type IObjectAnyKey = IObjectNumberKey | IObjectStringKey | {};

我的函数获取参数 - 这种类型的数组,我想迭代每个对象的每个键。

function myFunction( ...sources: IObjectAnyKey[]) {
const values = [];
for (let i = 0; i < sources.length; i++) {
const source: IObjectAnyKey = sources[i];
for (let key in source) {
const val = source[key];
}
}
}

您可以在 Playground 中看到错误:typescript.org/myTask (您需要在选项中启用“noImplicitAny”)

enter image description here

错误是“元素隐式具有“any”类型,因为类型“IObjectAnyKey”没有索引签名”。我怎么解决这个问题?我需要知道如何定义具有不同索引类型的类型。或者,也许还有其他解决方案。

最佳答案

IObjectAnyKey 本质上等同于空类型 {}{} 类型几乎匹配所有值(nullundefined 除外),因此 {} 的并集> 与其他任何内容(除了可能的 nullundefined 类型)也是 {}。因此,TypeScript 不知道 source 中有哪些键(keyof IObjectAnyKey 相当于 never,即空集),因此它不愿索引到它。

您的 IObjectStringKey 仅比 {} 稍窄。自从 TypeScript 引入 implicit index signatures ,任何具有已知文字键的类型都可以扩展到具有索引签名的类型,其值类型是所有值类型的并集。例如:

const literalKeys = {a: 'hey', b: 2, c: true};
const indexSignature: {[k: string]: string | number | boolean} = literalKeys;

上述分配之所以有效,是因为 literalKeys 与索引签名兼容。因此,如果您myFunction() 接受 IObjectStringKey 数组,它不应该阻止您调用它:

function myFunction(...sources: IObjectStringKey[]) {
const values = [];
for (let i = 0; i < sources.length; i++) {
const source = sources[i];
for (let key in source) {
const val = source[key]; // no error
}
}
}
myFunction({},{a: 'hey'},{b: 2}); // still works
<小时/>

如果您坚持使用(相对无用的)IObjectAnyKey,您始终可以执行类型断言来消除错误:

function myFunction(...sources: IObjectAnyKey[]) {
const values = [];
for (let i = 0; i < sources.length; i++) {
const source = sources[i];
for (let key in source) {
const val = (source as any)[key]; // explicitly "any"
}
}
}

希望有帮助。祝你好运。

关于javascript - 如何确定 typescript 中可能具有字符串和数字索引的对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49690251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com