Microsoft/TypeScript
Voir sur GitHubCertain homomorphic mappings break assignability with exactOptionalPropertyTypes
Open
#60 233 ouverte le 15 oct. 2024
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
💻 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