microsoft / microsoft/TypeScript
Assertion signature on generics doesn't narrow
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproduce el fallo de narrowing del TypeScript Playground enlazado, comparando la aserción genérica con la aserción con un parámetro unknown. Sigue el procesamiento de las firmas de aserción y el narrowing genérico del flujo de control en el compilador, y añade una prueba de regresión que muestre que el destructuring después de assert(func) infiere name y lines sin un error de implicit-any.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 35/100