PokéRogue
    Preparing search index...

    Type Alias Except<ObjectType, KeysType, Options>

    Create a type from an object type without certain keys.

    We recommend setting the requireExactProps option to true.

    This type is a stricter version of Omit. The Omit type does not restrict the omitted keys to be keys present on the given type, while Except does. The benefits of a stricter type are avoiding typos and allowing the compiler to pick up on rename refactors automatically.

    This type was proposed to the TypeScript team, which declined it, saying they prefer that libraries implement stricter versions of the built-in types (microsoft/TypeScript#30825).

    Type Parameters

    import type {Except} from 'type-fest';

    type Foo = {
    a: number;
    b: string;
    };

    type FooWithoutA = Except<Foo, 'a'>;
    //=> {b: string}

    // @ts-expect-error
    const fooWithoutA: FooWithoutA = {a: 1, b: '2'};
    // errors: 'a' does not exist in type '{ b: string; }'

    type FooWithoutB = Except<Foo, 'b', {requireExactProps: true}>;
    //=> {a: number} & Partial<Record<'b', never>>

    // @ts-expect-error
    const fooWithoutB: FooWithoutB = {a: 1, b: '2'};
    // errors at 'b': Type 'string' is not assignable to type 'undefined'.

    // The `Omit` utility type doesn't work when omitting specific keys from objects containing index signatures.

    // Consider the following example:

    type UserData = {
    [metadata: string]: string;
    email: string;
    name: string;
    role: 'admin' | 'user';
    };

    // `Omit` clearly doesn't behave as expected in this case:
    type PostPayload = Omit<UserData, 'email'>;
    //=> {[x: string]: string; [x: number]: string}

    // In situations like this, `Except` works better.
    // It simply removes the `email` key while preserving all the other keys.
    type PostPayloadFixed = Except<UserData, 'email'>;
    //=> {[x: string]: string; name: string; role: 'admin' | 'user'}