Далее c: 3 должно быть ошибкой типа, но это не так. Как этого достичь?
export type ExcludeUndefined<T> = T extends undefined ? never : T
export type GetRequiredKeys<T> = { [K in keyof T]: undefined extends T[K] ? never : K }[keyof T]
export type KeepRequiredKeys<t> = {
[k in ExcludeUndefined<GetRequiredKeys<t>>]-?: undefined extends t[k] ? never : t[k]
}
const ok: KeepRequiredKeys<{
b: 1
c?: number | undefined
}> = { b: 1, c: 3 } // this type errors as expected
const bad: () => KeepRequiredKeys<{
b: 1
c?: number | undefined
}> = () => ({ b: 1, c: 3 }) // c: 3 should be type error, is not
Ссылка на площадку