I have one Interface:
interface MyInterface {
name: string,
email?: string,
age?: number
}
Convert fields in the interface to required
The desired result is as follows:
interface NewInterface01 {
name: string,
email: string,
age: number
}
Solution:
// Use -? for required
type ConvertFromOptionalToRequired<T extends {}> = {
[K in keyof T]-?: T;
};
// Convert:
interface NewInterface01
extends ConvertFromOptionalToRequired<MyInterface> {}
Convert fields in the interface to optional
The desired result is as follows:
interface NewInterface02 {
name?: string,
email?: string,
age?: number
}
Solution:
// Use ? for optional
type ConvertFromRequiredToOptional<T extends {}> = {
[K in keyof T]?: T;
};
// Convert:
interface NewInterface02
extends ConvertFromOptionalToRequired<MyInterface> {}
Convert some fields by name instead of all
The desired result is as follows:
type NewInterface02ChangedSomeField {
name?: string,
email: string,
age: number
}
Solution:
// Convert:
type NewInterface02ChangedSomeField = Partial<Pick<Test, 'name'>> & Required<Pick<Test, 'email' | "age">>;
Convert fields in the interface to other value type
Convert all fields
The desired result is as follows:
interface NewInterface03 {
name?: boolean,
email?: boolean,
age?: boolean
}
Solution:
// Use TTO as new Type
type ModifyAllProp<T extends {}, TTo> = {
[K in keyof T]: TTo;
};
// Convert:
interface NewInterface03
extends ModifyAllProp<MyInterface, boolean> {}
Convert fields according to the original value type
The desired result is as follows:
interface NewInterface04 {
name: boolean,
email: boolean
age?: number
}
Solution:
type ModifyPropByType<T extends {}, TFrom, TTo> = {
[K in keyof T]: Exclude<T[K], undefined> extends TFrom
? TTo
: Exclude<T[K], undefined> extends {}
? ModifyProp<T[K], TFrom, TTo>
: T[K];
};
// Change all string field to boolean field
interface NewInterface04
extends ModifyPropByType<MyInterface, string, boolean> {}
Convert fields in the interface to optional and change the value type
The desired result is as follows:
interface NewInterface05
{
name?: 0 | 1,
email?: 0 | 1,
age?: 0| 1
}
// Use ? for optional, and TTO or some thing for this key as a type. In this example, I use 0|1, you can try boolean or something else
type ConvertAllPropOptional<T extends {}, TTo> = {
[K in keyof T]?: T;
};
// Convert:
interface NewInterface05
extends ConvertAllPropOptional<MyInterface , 0 | 1> {}