将对象转换为联合类型

时间:2019-04-20 13:01:47

标签: typescript typescript-typings

我对打字稿有疑问。我想从对象值创建某种东西,例如联合。我该如何实现? 例如:

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]; 

但用于对象。 欢迎任何提示。

2 个答案:

答案 0 :(得分:1)

我认为这是您所需要的:

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>; 

答案 1 :(得分:1)

要获取变量类型中的值的并集,可以使用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
}