microsoft / microsoft/TypeScript
Certain homomorphic mappings break assignability with exactOptionalPropertyTypes
オープン
まだ誰も着手していません。
Domain: flag: exactOptionalPropertyTypes
Help Wanted
Possible Improvement
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔎 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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
exactOptionalPropertyTypes を有効にした、リンク先の TypeScript playground で、WrappedT、Omit、HomomorphicOmit の例を使用して報告された動作を再現してください。ホモモーフィックな mapped type と条件付き推論が代入可能性にどのような影響を与えるかを調査し、その後、報告された true | undefined エラーなしで mapped result が引き続き T に代入可能であることを確認してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100