microsoft / microsoft/TypeScript
Suggestion: assigning index signature to object with optional properties should error if value types mismatch
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.3k
- 平均マージ
- 2日 4時間
- マージ済み PR(30日)
- 132
説明
Suggestion
Moving this here from a Twitter discussion with @RyanCavanaugh: https://twitter.com/SeaRyanC/status/1359194486601994241
🔍 Search Terms
- index signature
- partial
- optional
✅ Viability Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
⭐ Suggestion
Currently this does not error:
const a: { [key: string]: string } = { foo: 'bar' };
// Expected error here but got none
const t: { foo?: number } = a;
// Runtime type is `string`
// TS type is `number | undefined` ❌
console.log(t.foo);
My suggestion is simply that TypeScript should error at the point when we try to assign the index signature type to the object that has an optional property:
// My suggestion: this should error
const t: { foo?: number } = a;
📃 Motivating Example
Currently we could run into exceptions at runtime. Example:
const a: { [key: string]: string } = { foo: 'bar' };
// Expected error here but got none
const t: { foo?: number } = a;
// Runtime exception ❗️
t.foo?.toExponential();
💻 Use Cases
This is my real world use case:
I have a type that represents URL query parameters before they have been validated/decoded:
type QueryParams = {
[key: string]: string | string[];
};
I also have a type that represents query parameters after they have been validated/decoded:
type QueryData = {
userId?: number;
};
I have some functions which expect QueryData, but it's very easy to make the mistake of passing in QueryParams instead.
declare const redirectToUserPage: (queryData: QueryData) => void;
declare const queryParams: QueryParams;
declare const queryData: QueryData;
// This is a mistake but TS produces no error
redirectToUserPage(queryParams);
// We should have passed in `queryData` instead
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、2つの TypeScript Playground の例を再現し、インデックスシグネチャ、オプショナルプロパティ、値の型が一致しない場合についての提案の代入可能性シナリオを読みます。安全でない代入が適切な型エラーで拒否され、要求された動作が既存の TypeScript の互換性ルールとの一貫性を保っていれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 30/100