extends { default: any } ? never : T extends { break: any } ? never : T;
function addFunctions<T extends { [name: string]: Function }>(functions: FunctionsMap<T>) {
const defaultFunctions = {
default: () => { /* blah-blah */ },
break: () => { /* blah-blah */ },
};
return { ...defaultFunctions, ...functions };
}
addFunctions({ test: () => { } }); // работает addFunctions({ default: () => { } }) // ругается
It works fine this way
Не уверен, что TS сможет вывести тип ключей, но можно попробовать type DefaultKeys = 'default' | 'break'; type FunctionMap<T> = T extends Record<infer K, Function> ? Omit<Record<K, Function>, DefaultKeys> : never
У меня только такая штука придумалась (запрещает поля 'default' и 'break' во входящем параметре.
Обсуждают сегодня