microsoft / microsoft/TypeScript
Control flow not formed when using consts
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
TypeScript Version: 2.0.3
Code
interface Releasable {
release(): void;
}
const typeOfNumber: string = 'number';
function release(releasable: number | Releasable): void {
if(typeof releasable === typeOfNumber) {
allocated.splice(allocated.indexOf(releasable), 1);
} else {
releasable.release();
}
}
Expected behavior:
interface Releasable {
release(): void;
}
const typeOfNumber: string = 'number';
function release(releasable: number | Releasable): void {
if(typeof releasable === typeOfNumber) {
allocated.splice(allocated.indexOf(releasable), 1); // Ok, typeof releasable is number here
} else {
releasable.release(); // Ok, typeof releasable implements Releasable here
}
}
Actual behavior:
interface Releasable {
release(): void;
}
const typeOfNumber: string = 'number';
function release(releasable: number | Releasable): void {
if(typeof releasable === typeOfNumber) {
allocated.splice(allocated.indexOf(releasable), 1); // [ts] Argument of type 'number | Releasable' is not assignable to parameter of type 'number'. Type 'Releasable' is not assignable to type 'number'.
} else {
releasable.release(); // [ts] Property 'release' does not exist on type 'number | Releasable'.
}
}
Currently type guards are only limited to literals. Type guards are consumed at compile time and from this taken in mind variables defined with let or var seems natural to not result in proper control flow but type guards using constants defined with const should result in a proper type guard. Since the compiler already knows that consts will not change their value ans so their value should be checked dose it evaluate to known typeof return value to form a proper control flow else to result in a [ts] error ...
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 eseguendo l'esempio fornito di TypeScript 2.0.3 e confronta gli errori segnalati con il comportamento di narrowing previsto. Traccia quindi la gestione dei type guard del flusso di controllo del compilatore per i confronti typeof, poi aggiungi test che mostrino che una stringa const non modificata abilita il narrowing, mentre le variabili mutabili non lo fanno.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100