Skip to content

Instantly share code, notes, and snippets.

@gaetanlegac
Last active September 28, 2021 08:25
Show Gist options
  • Save gaetanlegac/74f672d8dcdb97f542183a84b9aa5e73 to your computer and use it in GitHub Desktop.
Save gaetanlegac/74f672d8dcdb97f542183a84b9aa5e73 to your computer and use it in GitHub Desktop.
Get object type with required and/or additionnal fields
declare type With<
TObject,
TRequired extends (keyof TObject) | {[key in keyof TObject]?: any},
TAdditionnal extends {[key: string]: any} = {}
> = (
Omit<TObject, TRequired extends (keyof TObject) ? TRequired : keyof TRequired>
&
(TRequired extends (keyof TObject) ? Required<Pick<TObject, TRequired>> : TRequired)
&
TAdditionnal
)
/*----------------------------------
- USAGE EXAMPLE
- https://www.typescriptlang.org/play?#code/CYUwxgNghgTiAEAXAngBwQdQJaIBYB4AoeE+AFQHkAjAK3EQBpjSyAlEARwFcs5h4QAD0QgAdsADO8ABQBrEMgD2AM3LU6YRAEp4AH3gBvANrzk8LKPimVa2vQC6AfgBc8KKOQBfJqXIBBYGAcLEVRUSgIAWExSUMTBVcJRBgLAHN7V3cveABeQ09CAD5cmWYSCgBbHHxKO00GcnZuXhB+IRFxKTkFG1qNbXhHRs4ePnhXa1U2EZbgYrL4ADJ4Belp5rH2mK7J236dIabR1vwABSwwWRr1egb147ni13vZrQXFhbIAoMQQsIjCG9fL5CAB6UHwACigigFVQEBACxBkCgEikAFlkEcQEkagARKCIKBRDqxLIlLLFAwLVBcKgQC7wLgwCAAQkSyTSAG4aXSGWB4MBCVAXOQCUSeQVgaRCCh0PBsUk-OJxcS8tg8PhMYrGPAAORCol6wo88GGJksjkpUSpBqGqCZDzwKXSlZyhA65XAAByXAqIBSYFVJQ1BG1IxxuoMguFrlEfqoAedJrBEOjzIgVrSdtj8HjFUTMGdQA
----------------------------------*/
class MyRequest<TData extends any = any> {
public url!: string;
public data?: TData;
}
type RequestAndData = With<MyRequest, 'data'>;
// { url: string, data: any }
type RequestAndNumericData = With<MyRequest, { data: number }>;
// { url: string, data: number }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment