Ух, это заняло у меня много времени.
Вот проблема. Представьте, что код выше скомпилирован . Далее представьте, что вы пытаетесь вызвать f()
следующим образом:
type KillerType = {
myNewArg(): void;
}
f( k, (kt: KillerType) => kt.myNewArgs());
Теперь нет значения, которое вы можете использовать для k
, что имеет смысл. Оно должно иметь свойство myNewArg
быть как числом, так и функцией со значением void, что совершенно невозможно. Даже игнорируя проблему проверки типов, f()
будет вызывать анонимную функцию без какого-либо значения myNewArg
.
Это можно исправить:
type DifferentArgs<T> = {
myNewArg: number;
} & T;
type SameArgs<T> = Omit<T, 'myNewArg'>;
function f<T, U>({ myNewArg, ...t }: DifferentArgs<T>,
g: (q: SameArgs<T>) => U): U {
return g(t);
}
По сути, вы должны пообещайте компилятору, что параметру g
никогда не понадобится свойство с именем myNewArg
, поэтому конфликт никогда не может возникнуть .