TypeScript undefinedとnullを各プロパティから削除したい場合

// この型を
type User = {
    id: string
    value: string | undefined
    code: number | null | undefined
}

// このようにしたい
/*
{
    id: string;
    value: string;
    code: number;
}
*/
// これを使う
type NoUndefinedField<T> = { [P in keyof T]: NonNullable<T[P]> }

// 期待した型になる
type NoUndefinedUser = NoUndefinedField<User>

memo

value だけ undefined と null を除去したい。

type User = {
    id: string
    value: string | undefined
    code: number | null | undefined
}

// わかりづらい。。
type NoUndefinedField<T extends {value: any}> = { [P in keyof Pick<T, 'value'>]: NonNullable<Pick<T, 'value'>[P]> } & Omit<T, 'value'>

type NoUndefinedUser = NoUndefinedField<User>

// これはOK
const a: NoUndefinedUser = {
    id: 'AAA',
    value: 'BBB',
    code: undefined
}

// これはNG
const b: NoUndefinedUser = {
    id: 'AAA',
    value: undefined,
    code: undefined
}