Универсальный базовый объект в Typescript

#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