You can extend Required<I>
Required<I>
function works<T extends Required<I> = Required<I>>(i: T) { const foo: number = i.foo; }
If for some reason you need to also force Required<T>, you can leave i: Required<T> as your parameter.
Required<T>
i: Required<T>