microsoft / microsoft/TypeScript
Certain homomorphic mappings break assignability with exactOptionalPropertyTypes
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
🔎 Search Terms
eopt exactOptionalPropertyTypes homomorphic Omit unassignable
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 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 de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez le comportement signalé dans le playground TypeScript lié avec exactOptionalPropertyTypes activé, en utilisant les exemples WrappedT, Omit et HomomorphicOmit. Examinez comment les types mappés homomorphes et l’inférence conditionnelle affectent l’assignabilité, puis vérifiez que les résultats mappés restent assignables à T sans l’erreur true | undefined signalée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100