Giter Club home page Giter Club logo

Comments (6)

Nr9 avatar Nr9 commented on September 27, 2024 1

I have a similar issue with DistributedOmit

The simple following type does not work

type ReplaceKey<T, V> = T extends { key: string } ? DistributedOmit<T, 'key'> & { key: V } : T

I get the following error

TS2344: Type "key" does not satisfy the constraint KeysOfUnion<T>

from type-fest.

sindresorhus avatar sindresorhus commented on September 27, 2024

Why?

from type-fest.

tommytroylin avatar tommytroylin commented on September 27, 2024

@sindresorhus

we were build a component wrapper which disallow passing some specific props directly

the Omit in typescript works great until some one come in with a union typed props

here is the demo

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

type DistributedOmitLoose<
  ObjectType,
  KeyType extends keyof any,
> = ObjectType extends unknown ? Omit<ObjectType, KeyType> : never;

type SomeComponentPropsTypeWithControl = {
  onChange: (value: any) => void;
  controllable: true;
};

type SomeComponentPropsTypeWithoutControl = {
  controllable: false;
};

type SomeComponentProps =
  | SomeComponentPropsTypeWithoutControl
  | SomeComponentPropsTypeWithControl;

// works
type Result1 = Omit<SomeComponentProps, 'value'>;


// works and exactly what i want
type Result2 =
  | Omit<SomeComponentPropsTypeWithControl, 'value'>
  | Omit<SomeComponentPropsTypeWithoutControl, 'value'>;

// loose constraint. works. same as Result2
type Result3 = DistributedOmitLoose<SomeComponentProps, 'value'>;

// DistributedOmit from package
// Type '"value"' does not satisfy the constraint 'keyof SomeComponentPropsTypeWithoutControl'
type Result4 = DistributedOmit<SomeComponentProps, 'value'>;

IMO, when omitting properties from a interface, there's no need to check if they were actually exist.
That's why TS's Original Omit didn't check the 2nd type argument. (Just my opinion, not checked if it's right)

from type-fest.

sindresorhus avatar sindresorhus commented on September 27, 2024

I do agree that it would be nice to support this use-case. One downside is that it then would not be able to auto-complete the key.

from type-fest.

sindresorhus avatar sindresorhus commented on September 27, 2024

@henriqueinonhe Thoughts?

from type-fest.

medv avatar medv commented on September 27, 2024
DistributedOmitLoose

This is fantastic, thank you. In a heavily abstracted layer of framework code, it's most often not possible to get autocompletion on Omit anyway. This is a great drop in replacement for DistributedOmit.

from type-fest.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.