小编Jan*_*fer的帖子

打字稿:对象和原语之间的 keyof typeof union 永远不会

首先,我的问题的一些上下文:我有一个项目,我通过 Socket.IO 接收一个对象,因此我没有关于它的类型信息。此外,它是一种相当复杂的类型,因此需要进行大量检查以确保接收到的数据良好。

问题是我需要访问由接收对象中的字符串指定的本地对象的属性。这适用于第一维,因为我可以将 any 类型的属性说明符转换keyof typeof为我想要访问的任何内容(例如this.property[<keyof typeof this.property> data.property])。

结果变量的类型显然是一个相当冗长的联合类型(联合所有属性的所有类型this.property)。只要这些属性之一是非原始类型,keyof typeof subproperty就被推断为never.

通过之前所做的检查,我可以保证该属性存在,并且我 99% 地确定代码在编译后会运行。抱怨的只是编译器。

下面是一些非常简单的代码,可重现此行为以及观察到的和预期的类型。

const str = 'hi';
const obj = {};
const complexObj = {
    name: 'complexObject',
    innerObj: {
        name: 'InnerObject',
    },
};

let strUnion: typeof str | string;              // type: string
let objUnion: typeof obj | string;              // type: string | {}
let complexUnion: typeof complexObj | string;   // type: string | { ... as …
Run Code Online (Sandbox Code Playgroud)

types type-inference type-conversion typescript

4
推荐指数
1
解决办法
3441
查看次数