#typescript
Вопрос:
Как нам создать универсальный базовый объект в Typescript, чтобы мы могли назначать объектам любые дополнительные значения ключей?
Со следующим кодом я получаю эту ошибку
Type 'HandlerParams' is missing the following properties from type
'{knownKey: string, unknownKey1: string, unknownKey2: string;}':
unknownKey1, unknownKey2
interface HandlerParams {
knownKey: string;
[key: string]: any
}
type Handler = (args: HandlerParams) => any
function errorHandler(handler: Handler) {
return ({logger, ...params}: HandlerParams) => {
return handler({logger, ...params})
}
}
errorHandler(({knownKey, unknownKey1, unknownKey2}: {knownKey: string; unknownKey1: string; unknownKey2: string}) => {
//...
})
Комментарии:
1. Вы можете использовать
Record<string, any>
2. Как я знаю, вы должны объявить параметры обработчика следующим образом
{knownKey: string;} amp; {[key: string]: any;}
Ответ №1:
Я изменил ваш код, используя дженерики:
interface HandlerParams {
knownKey: string;
logger?: any;
}
type Handler<T extends HandlerParams> = (args: T) => any;
function errorHandler<T extends HandlerParams>(handler: Handler<T>) {
return (params: T) => {
return handler(params);
};
}
interface UnknownKeys extends HandlerParams {
knownKey: string;
unknownKey1: string;
unknownKey2: string;
}
errorHandler(({ knownKey, unknownKey1, unknownKey2 }: UnknownKeys) => {
//...
});
Вы можете прочитать о дженериках здесь: Официальная документация
Ответ №2:
Если вы знаете , что каждое значение в объекте есть string
, вы можете сделать это:
interface HandlerParams {
knownKey: string;
[key: string]: any
}
type Handler = (args: HandlerParams) => any
function errorHandler(handler: Handler) {
return ({ logger, ...params }: HandlerParams) => {
return handler({ logger, ...params })
}
}
type Indexed = { [prop: string]: string }
errorHandler(({ knownKey, unknownKey1, unknownKey2 }: Indexed) => {
//...
})
Вы можете использовать любые ключи в своем разрушенном объекте. Все они будут выведены как string