context?: {
[name: string]: any;
};
export interface IMail {
to: string
subject: string,
template: string,
context: Record<string, unknown>;
}
function testFn<K extends TestKeys>(
obj: Partial<Type>, key: K
): Type[K]['value'] | undefined {
return key in obj ? obj[key]!.value : undefined
}
function getCampaigns () {
return knex('call as cc')
.where({
'cc.is_obsolete': false,
'cc.is_active': true,
})
.whereNotIn('cc.type_id', TYPES)
.select(
'cc.id',
'cc.value as config',
'cc.type_id as sale_type_id'
).catch(() => {/* здесь тот же код, который в кетч из первого */});
}
let key: 'a' | 'b';
let obj: {
a: T1;
b: T2;
};
let v1 = obj[key]; // T1 | T2
obj[key] = v2; // можно присвоить только T1 & T2
Ну а в универсальной функции emailSend всё равно будет достаточно IMail< Record< string, unknown > >
как альтернатива, вместо Record< string, unknown > здесь можно перечислить через | все возможные варианты контекста:
но, по моему, это менее гибко.
----
делать emailSend генериком, как предложено в ответе, нет надобности - от этого никаких плюсов. Да и опять же генерик надо будет ограничить типом Record< string, unknown >, чтобы данные можно было передать в mailerService.sendMail