microsoft / microsoft/TypeScript
Bug: Circular references not allowed for template literal types
Abierto
Nadie ha tomado este issue todavía.
Awaiting More Feedback
Suggestion
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Bug Report
🔎 Search Terms
- circularly, template literal
Related issues: #43335.
🕗 Version & Regression Information
- This changed between versions 4.0.5 and 4.1.5 (different bug before)
⏯ Playground Link
Playground link with relevant code
💻 Code
// you can have circular references in tuple types
type OneOrMoreArr0<C> = C | [C, ...OneOrMoreArr0<C>[]];
// note that
//
// type OneOrMoreArr0<C> = C | [C, OneOrMoreArr0<C>];
//
// is also valid
type OneOrMoreArr<C> = Exclude<OneOrMoreArr0<C>, C>;
const noEmptyArr: [] extends OneOrMoreArr<'*'> ? false : true = true;
const x1: OneOrMoreArr<'*'> = ['*'];
const x2: OneOrMoreArr<'*'> = ['*', '*'];
const x3: OneOrMoreArr<'*'> = ['*', '*', '*']
// but when you try and do the same thing with template literal types, you get an error
//
// "Type alias 'OneOrMoreStr0' circularly references itself."
//
// "Type 'OneOrMoreStr0' is not generic."
type OneOrMoreStr0<C extends string> = C | `${C}${OneOrMoreStr0<C>}`
// we should be able to do the above, and then have e.g.,
//
// const y1: OneOrMoreStr<'*'> = '*';
// const y2: OneOrMoreStr<'*'> = '**';
// const y3: OneOrMoreStr<'*'> = '***';
// if 'C' is the empty string, the above just reduces to:
//
// OneOrMoreStr0<''> = '';
//
// otherwise the same logic as with `OneOrMoreArr0` should apply
🙁 Actual behavior
You get the error:
Type alias 'OneOrMoreStr0' circularly references itself.
Type 'OneOrMoreStr0' is not generic.
🙂 Expected behavior
This should type check like with the tuple example - it's the same principle, just with template literals.
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
Comienza con el TypeScript Playground enlazado y los ejemplos reducidos de tuplas recursivas y template literals del issue. Compara cómo se aceptan los alias de tupla recursivos con cómo se rechaza el alias de template literal; se considera terminado cuando los ejemplos de OneOrMoreStr pasan la comprobación de tipos sin los errores de referencia circular.
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
- Bastante claro
- Aptitud para principiantes
- 38/100