- 保留所有必需的属性
type GetRequired<T extends Record<string, any>> = {
[K in keyof T as T[K] extends Required<T>[K] ? K : never]: T[K]
}
type result = GetRequired<{ foo: number; bar?: string }>;
type result1 = GetRequired<{ foo: undefined; bar?: undefined }>;
- 保留可选属性
type GetOptional<T extends Record<string, any>> = {
[K in keyof T as T[K] extends Required<T>[K] ? never : K]: T[K]
}
type result = GetRequired<{ foo: number; bar?: string }>;
type result1 = GetRequired<{ foo: undefined; bar?: undefined }>;
- 获取必需属性的key
type RequiredKeys<T extends Record<string, any>> = keyof {
[K in keyof T as T[K] extends Required<T>[K] ? K : never]: T[K]
}
type result = RequiredKeys<{ a: number; b?: string }>;
type result1 = RequiredKeys<{ a: undefined; b?: undefined; c: string; d: null }>;
- 去除两端空白字符
type Space = ' ' | '\n' | '\t'
type Trim<S extends string> = S extends `${Space}${infer L}` | `${infer L}${Space}` ? Trim<L> : S;
type result = Trim<' str'>;
type result = Trim<'str '>;
type result = Trim<' str'>;
type result = Trim<' str '>;