Typescript 从交叉点类型中选择?(TS)
我对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
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