【问题标题】:How to iterate through an object in TypeScipt - A proper way [duplicate]如何在 TypeScript 中迭代对象-正确的方法[重复]
【发布时间】:2021-07-07 20:04:28
【问题描述】:

不在这里寻找解决方案,只需要知道这是否是打字稿中的错误。就是这样。

这是 TypeScript 中的错误吗?我应该报告这个错误吗?据我了解,这应该有效,除非我在这里做错了什么,

interface Something {
    key1: string;
    key2: number;
    key3: boolean;
}

const someObject: Something = {
    key1: '123',
    key2: 123,
    key3: false
}

for (const key in someObject) {
    console.log(someObject[key]); // TS error
}

注意:我不是在寻找解决方法,因为这对我有用。只是想知道是我做错了什么还是 TS 中确实存在错误。

for (const [key, value] of Object.entries(someObject)) {
    console.log(key, value);
}

for (const key in values) {
    console.log(key, values[key as keyof DirectDepositDTO]);
}

我知道key 的类型是string,但不应该是keyof Something 吗?

TypeScript Playground Link

附:该问题被标记为重复,但我不是在这里寻求解决方案,我已经知道如何解决它。我只需要知道这是否是 TypeScript 中的错误。因为for (const key in someObject) { 意味着key 将是keyof Something。我不需要知道重新定义类型。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你有几种方法。

    如果你想使用for .. in循环,你应该允许TS使用索引属性:

    interface Something {
        key1: string;
        key2: number;
        key3: boolean;
    }
    
    type Values<T> = T[keyof T]
    type MakeIndexed<T> = T & { [prop: string]: Values<T> }
    type SomethingIndexed = MakeIndexed<Something>
    
    const someObject: SomethingIndexed = {
        key1: '123',
        key2: 123,
        key3: false
    }
    
    for (const key in someObject) {
        const x = someObject[key] // Values<Something>
        const isString = someObject.key1 // string
    
        console.log(someObject[key]);
    }
    

    您还可以使用更多功能的方法,而无需额外的实用程序类型,而是使用类型转换:

        const someObject: Something = {
            key1: '123',
            key2: 123,
            key3: false
        }
    
        // FP way with more explicit types
        const keys2 = (Object.keys(someObject) as Array<keyof typeof someObject>).forEach(key => {
            const result = someObject[key]; // string | number | boolean
        })
    

    【讨论】:

    • 抱歉,我只是想知道这是否是 TypeScript 中的错误。因为如果我说for (const key in someObject) {,那很明显key 的类型将是keyof Something
    • @Hafiz 这不是错误。这是有意的,因为您可以使用具有其他属性的对象来实现接口/类型。界面只是您需要的最低限度。所以你不能知道对象的所有键都是接口的键。
    • @LindaPaiste 是的,我知道你可以用其他东西填充,如果是这种情况,那么应该有一个strict 选项来区分对象是否被修改。但是任何一个类型都应该是keyof (typeof values)。即使对象被修改,键也总是来自values对象
    • "类型应该是keyof (typeof values)。即使对象被修改,键也总是来自values对象"。只有@987654333才是正确的@ 是详尽的which is not always the case
    • @LindaPaiste 我明白你的意思了。我认为我们需要一个特定的strict 类型,你不能像那样解构接口。如果您可以将该解释写为答案,我会将其标记为已解决。因为那是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2017-04-18
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多