Microsoft/TypeScript

Certain homomorphic mappings break assignability with exactOptionalPropertyTypes

Open

#60 233 ouverte le 15 oct. 2024

Voir sur GitHub
 (2 commentaires) (0 réactions) (0 assignés)TypeScript (6 726 forks)batch import
Domain: flag: exactOptionalPropertyTypesHelp WantedPossible Improvement

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

Description

🔎 Search Terms

eopt exactOptionalPropertyTypes homomorphic Omit unassignable

🕗 Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

https://tsplay.dev/w28Qzm

💻 Code

// @exactOptionalPropertyTypes

type T = {
  foo?: true;
  bar?: true;
};

type WrappedT<t extends T> = [t];

// Since Omit is normally treated as homomorphic, should work but errors with:
// Type 'true | undefined' is not assignable to type 'true'.
type OmitBarFromWrapped<t> =
  t extends WrappedT<infer inner> ? WrappedT<Omit<inner, "bar">> : never;

// Even if we directly rewrite Omit to be homomorphic, we still lose assignability with EOPT
type OmitHomomorphicFromWrapped<t> =
  t extends WrappedT<infer inner>
    ? WrappedT<HomomorphicOmit<inner, "bar">>
    : never;

type HomomorphicOmit<t, keyToOmit> = {
  [k in keyof t as k extends keyToOmit ? never : k]: t[k];
};

// Normally in this situation, I have a conform utility to force TS to allow the type
// but this is maybe the first time I've also seen that not work?
type OmitHomomorphicFromWrappedConformed<t> =
  t extends WrappedT<infer inner>
    ? WrappedT<conform<HomomorphicOmit<inner, "bar">, T>>
    : never;

type conform<t, base> = t extends base ? t : base;

🙁 Actual behavior

Applying a homomorphic mapping to a type can break property assignability with EOPT

🙂 Expected behavior

Should preserve assignability

Additional information about the issue

No response

Guide contributeur