This will do:
type MyType<T extends object> = { [S in keyof T]: [S, (s1: T[S], s2: T[S]) => any] }[keyof T];
const e: MyType<Car> = ['engine', (e1: Engine, e2: Engine) => { }];
Explanation (due to request in comment):
Just break it apart.
Consider type:
type MyType1<T extends object, S extends keyof T> = [S, (s1: T[S], s2: T[S]) => any];
This type seems pretty obvious. But has one disadvantage - you must type key name explicitly.
const e: MyType1<Car, 'engine'> = ['engine', (e1: Engine, e2: Engine) => { }];
So you make union of all MyType1 possibilities for each property key:
type MyType2<T extends object> = { [S in keyof T]: MyType1<T, S> }[keyof T];
The original type above was just these two steps in one ;).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…