microsoft / microsoft/TypeScript
Assertion signature on generics doesn't narrow
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
🔎 Search Terms
Assertion AND signature
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about Assertion Signatures, Generics.
⏯ Playground Link
💻 Code
// "Good assert": makes destructuring succeed
// function assert(c: unknown): asserts c {
// if (!c) {
// throw new TypeError('Assertion failed');
// }
// }
// "Bad assert": destructuring error
function assert<C>(c: C): asserts c {
if (!c) {
throw new TypeError('Assertion failed');
}
}
export function test(lines: string[]): string[] {
let func: {
name: string;
lines: string[];
} | null = null;
for (const line of lines) {
if (Math.random() < 0.5) {
func = {
name: "qwer",
lines: [line],
};
} else {
assert(func);
const {name, lines} = func; // <=== ERROR HERE: 'name' implicitly has type 'any'
lines.push(line);
assert(name !== 'abc');
}
}
if (func)
return func.lines;
return lines;
}
🙁 Actual behavior
When the generic-assert implementation is active, the line -
const {name, lines} = func;
errors with 'name' implicitly has type 'any'.
When the unknown assert implementation is active, types are properly inferred.
🙂 Expected behavior
Both assert versions contain assertion signature, and both should be able to narrow the type.
Additional information about the issue
No response
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
Riproduci il fallimento del narrowing dal TypeScript Playground collegato, confrontando l’asserzione generica con l’asserzione con un parametro unknown. Traccia la gestione delle firme di asserzione e del narrowing generico del flusso di controllo nel compilatore, quindi aggiungi un test di regressione che mostri che il destructuring dopo assert(func) inferisce name e lines senza un errore di implicit-any.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100