microsoft / microsoft/TypeScript
Feature: Lazy object initialization
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
Search Terms
lazy object initialization
Suggestion
Introduce ability to initialize objects lazily and check if it was initialized.
I suggest new keyword lazyof (or other name) which would work as following:
- You can assign
Partial<T>tolazyof T. - Only property from type
Tcan be assigned tolazyof T. - Compiler should keep track of what properties were assigned to variable of type
lazyof T. - Every time you reference variable with type
lazyof Tit should be treated as if it's type was{ properties, which, you, assigned, up, to, this, point }. This implies that when you assign such variable to other variable/return it, the implicit type should be latter (see example 1 and 2). - When
lazyof Tvariable goes out of scope, compiler should check if all the required properties ofTare set.
Use Cases
- Initializing objects like this:
const obj = {};
obj.foo = 1;
is common practice in JS. It would be nice to have a proper type checking
-
Easier migration from JS to TS. You don't need to convert lazy object initialization to eager.
-
Eager object initialization is not always the simplest approach and might complicate code
-
Ability to check whether object was properly initialized in constructor/named constructor (see last example)
Examples
Simple example:
const obj: lazyof { [key: string]: any } = {};
obj.foo = 1;
const otherObj = obj; // otherObj implicit type is { foo: number }
obj.bar = 'a';
const otherObj2 = obj; // otherObj2 implicit type is { foo: number, bar: string }
Implicit function return type:
function initialize() {
const obj: lazyof { [key: string]: any } = {};
obj.foo = 1;
obj.bar = 'a';
return obj; // function initialize implicit return type is { foo: number, bar: string }
}
With specific interface:
interface Obj {
foo: number;
}
const obj: lazyof Obj = {};
obj.foo = 1;
obj.bar = 'a'; // error, property bar doesn't exists on Obj.
Going out of scope:
interface Obj {
foo: number;
bar: string;
}
function initialize(obj: lazyof Obj) {
obj.foo = 1;.
// error. obj variable goes out of scope, but { foo: number } is not assignable to Obj
}
Check if object instance is initialized:
class Obj {
foo: number;
bar: string;
private constructor() {}
static namedConstructor(): Obj {
const self: lazyof Obj = new Obj;
self.foo = 1;
console.log(obj.bar); // // error, property bar doesn't exists on { foo: number }
return self;
// error. self variable goes out of scope, but { foo: number } is not assignable to Obj
}
}
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, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、変数の代入、プロパティの追跡、推論された型、スコープチェックに関係する TypeScript コンパイラーと型チェックの設計を確認します。issue では特定のファイルやテストは指定されていません。完了条件は、提案された lazyof の動作を定義して実装することです。これには、代入の制限、推論された型の変化、プロパティアクセスエラー、変数がスコープを離れる際の検証が含まれます。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- javascript, typescript
- 領域
- compilers
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 30/100