Используйте вариант
Robur.
Почему? Потому что в общем смысле то чего вы хотите автоматически получить невозможно, т.к. порядок ключей в объекте(и интерфейсе) значения не имеет, т.е. нет никакой разницы меж:
interface TestInterface {
a: number;
b: string;
c: () => void;
}
и
interface TestInterface {
c: () => void;
a: number;
b: string;
}
а в функции, очевидно, имеет.
Вручную можно сделать так:
function test(a: TestInterface['a'], b: TestInterface['b'], c: TestInterface['c']): void {
// ,,,
}
Если порядок аргументов таки значения не имеет - в принипе можно накошмарить сложный тип, с использованием ...args, но не нужно.)