将对象转换为联合类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将对象转换为联合类型相关的知识,希望对你有一定的参考价值。

我有打字稿的问题。我想从对象值创建像union这样的东西。我怎么能做到这一点?例如:

const x = {
    x: 1,
    y: 2,
    z: 'a string',
    k: document.createElement('div')
}

const y = (y: the value which exist of x ): boolean => {
  return true
}

就像是:

type ValueOf<T> = T[keyof T]; 

但对于对象。任何提示都是受欢迎的。

答案

要获得变量类型中的值的并集,可以使用ValueOf<typeof x>。对于你的例子,类型将是string | number | htmlDivElement

const x = {
    x: 1,
    y: 2,
    z: 'a string',
    k: document.createElement('div')
}
type ValueOf<T> = T[keyof T]; 
const y = (P: ValueOf<typeof x>): boolean => { // p:  string | number | HTMLDivElement
   return true
}

从评论中你想要的文字类型(1 | 2 | "a string")不是基本类型。为此,您需要更改类型pf x以包含文字类型。最简单的方法是在3.4中添加一个const断言:

const x = {
    x: 1,
    y: 2,
    z: 'a string',
    k: document.createElement('div')
} as const
type ValueOf<T> = T[keyof T];
const y = (p: ValueOf<typeof x>): boolean => { // p:  1 | 2 | "a string" | HTMLDivElement
    return true
}
另一答案

我想这就是你需要的:

export const xx = {
    x: 1,
    y: 2,
    z: 'a string',
    k: document.createElement('div')
};

type ValueOf<T> = T[keyof T];

type XValues = ValueOf<typeof xx>; 

以上是关于将对象转换为联合类型的主要内容,如果未能解决你的问题,请参考以下文章

对象不能从 DBNull 转换为其他类型。

在代码片段中包含类型转换

打字稿:将标记的联合转换为联合类型

将联合类型转换为交集类型[重复]

如何将元组类型转换为联合?

将打字稿接口属性类型转换为联合[重复]