hasOwn和hasOwnProperty未按预期缩小TypeScript类型

kqhtkvqz  于 2023-05-01  发布在  TypeScript
关注(0)|答案(1)|浏览(134)

我在TypeScript中有一个简单的对象类型和一个由该对象中的所有键组成的对象,但不是相同的类型。我期望hasOwnProperty或hasOwn将类型缩小到类型键,但事实并非如此。下面是一个小例子,它总结了这个问题和我期望发生的事情:

type Example = {
    foo: string;
    bar: string;
}

type ExampleKeys = keyof Example;

// the type is Readonly to make sure there are no more extra keys in here later
const translation: Readonly<{[key in ExampleKeys]: string}> = {
    foo: "oof",
    bar: "rab",
};

function test(example: Example) {
    for (const [key, _] of Object.entries(example)) {
        if (translation.hasOwnProperty(key)) {
            // I expect key to be of type ExampleKeys here
        }

        if (Object.hasOwn(translation, key)) {
            // Tried with the new hasOwn method but didn't work too
        }
    }
}

一般来说,我希望迭代对象并只获取相关的键。我知道,由于结构类型,我可能会得到额外的属性,我试图远离它们,但我想知道如何做到这一点,而不复制键列表或进行Assert。我的翻译对象是需要的,感谢类型提示,我确保我不会犯错误,虽然我复制了那里的键,所以我想使用它是好的,但必须有一个更一般的方式,我希望至少。

lnlaulya

lnlaulya1#

在我看来,应该创建类型保护函数来缩小键的类型

function isExampleKey(key: string): key is ExampleKeys {
    return key in translation;
}

然后在里面使用这个函数

function test(example: Example) {
    for (const [key, _] of Object.entries(example)) {
        if (isExampleKey(key)) {
            // key is now narrowed to the specific ExampleKeys type
        }
    }
}

相关问题