Typescript 从交叉点类型中选择?(TS)

Typescript 从交叉点类型中选择?(TS),typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我对TS非常陌生,并编写了一个拾取函数,但发现很难从交叉点类型中拾取: type PaletteType = { black: string, white: string } type ColorType = { primaryColor: string, labelText: string, } type Props = { ..., backgroundColor: keyof ColorType | keyof PaletteType // (or

我对TS非常陌生,并编写了一个拾取函数,但发现很难从交叉点类型中拾取:

type PaletteType = {
   black: string,
   white: string
}

type ColorType = {
   primaryColor: string,
   labelText: string,
}

type Props = {
   ...,
   backgroundColor: keyof ColorType | keyof PaletteType // (or would keyof (ColorType & PaletteType) would be better?
}

// Some general pick funtion
function pick<T extends { [key: string]: any }, K extends keyof T>(object: T, key?: K) {
    if (key) { return object[key] }
    return undefined
}

pick(Colors, props.backgroundColor) // error -> black | white not assignable to Colors

添加以下声明以使代码可编译:

declare const Colors: ColorType;
declare const Palette: PaletteType;
declare const props: Props;
为了调用
pick()
type safe,您可以通过对象排列之类的方式合并
颜色
调色板

pick({ ...Colors, ...Palette }, props.backgroundColor); // okay
这是因为
{…Colors,…palete}
被视为类型
ColorType&paletetype
,其键是
keyof ColorType | keyof paletetype

或者,在调用
pick()
之前,您可以将
props.backgroundColor
缩小为
keyof ColorType
keyof paletetype

const hasKey=(obj:T,key:keyof any):key是keyof T=>obj中的key;
hasKey(颜色、道具、背景色)?
挑选(颜色、道具、背景色):
挑选(调色板、道具、背景色);//可以
前者可能更整洁

顺便说一句,我不确定是什么让你超过了
o[k]
,但我想这取决于你


希望有帮助;祝你好运

如果
拾取
是从
颜色
拾取,则传入
托盘类型
键无效。。不确定用什么好的方式来表达这一点。a:/n也不确定。我想能够选择调色板或颜色。(当然,也许我也可以将调色板和颜色合并在一起,这样在键入的langauge中会更有意义……)
pick({ ...Colors, ...Palette }, props.backgroundColor); // okay
const hasKey = <T extends object>(obj: T, key: keyof any): key is keyof T => key in obj;

hasKey(Colors, props.backgroundColor) ? 
  pick(Colors, props.backgroundColor) : 
  pick(Palette, props.backgroundColor); // okay