【问题标题】:TypesScript: Why does keyof {} have the type never?打字稿:为什么 keyof {} 没有类型?
【发布时间】:2020-04-27 17:24:56
【问题描述】:

keyof 应用于空对象时,我很困惑。示例代码:

const o = {};
const k : Array<keyof typeof o> = [];
// k has type never[]

为什么是never这个类型?我认为 never 是永远不会返回的函数的返回类型。类型不应该是any[]吗?

当像这样改变对象时,类型是有意义的:

const o = {a: 1, b: 2};
const k : Array<keyof typeof o> = []; 
// k has the type ("a" | "b")[]

我在实现一个返回对象的类型键的函数时发现了这种行为:

function getKeys(o: object) {
    return Object.keys(o) as Array<keyof typeof o>;
}

该函数的返回类型为never[],但如果我是正确的,它实际上应该有(keyof typeof o)[]

【问题讨论】:

    标签: javascript typescript types


    【解决方案1】:

    编辑:好的,所以,更新后问题对我来说更清楚了。这里的问题是您没有使用泛型,因此您实际上是在向 TS 询问 object 的键,而不是 SOME 对象 的键。

    你可以这样重新排列函数:

    function getKeys<O extends {}>(o: O) {
        return Object.keys(o) as Array<keyof O>;
    }
    

    这样它就会接受一个 O 类型的 generic 对象,在这种情况下,keyof O 将被准确地键入 Array&lt;keyof O&gt;。例如:

    const keys = getKeys({ a: 1, b: 2 });
    // Now keys has type ("a" | "b")[]
    

    编辑前的旧答案:

    never 代表一个永远不会出现的值,就像在TS Doc 中解释的那样。就是这种情况,因为对象中没有键。为了更好地理解它,来自 TS Doc 的这句话可能会有所帮助:

    never 类型是每个类型的子类型,并且可以分配给每个类型;

    这意味着,在这种情况下,never 正确地是字符串的子类型,尤其是“没有字符串”和“没有键”的意思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 2022-08-21
      • 2022-01-18
      • 2020-09-28
      • 2023-02-16
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多