microsoft / microsoft/TypeScript
Feature: Lazy object initialization
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
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.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia esaminando il compilatore TypeScript e il design del type-checking rilevante per l’assegnazione delle variabili, il tracciamento delle proprietà, i tipi inferiti e i controlli dello scope; l’issue non indica file o test specifici. Il lavoro è completato quando viene definito e implementato il comportamento lazyof proposto, incluse le restrizioni sulle assegnazioni, l’evoluzione dei tipi inferiti, gli errori di accesso alle proprietà e la validazione quando una variabile esce dallo scope.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 30/100