Добавление этих объявлений для компиляции кода:
declare const Colors: ColorType;
declare const Palette: PaletteType;
declare const props: Props;
Чтобы сделать вызов типа pick()
безопасным, вы можете объединить Colors
и Palette
с помощью чего-то похожего на распространение объекта:
pick({ ...Colors, ...Palette }, props.backgroundColor); // okay
Это работает, потому что {...Colors, ...Palette}
относится к типу ColorType & PaletteType
, чьи ключи keyof ColorType | keyof PaletteType
.
Или вы можете сделать определяемым пользователемнаберите guard , чтобы сузить props.backgroundColor
до keyof ColorType
или keyof PaletteType
перед вызовом pick()
:
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
Первый, вероятно, аккуратнее.
Кстати, я не уверен, что pick(o,k)
покупает у вас всего за o[k]
, но я думаю, это зависит от вас.
Надеюсь, это поможет;удачи!