microsoft / microsoft/TypeScript
Typescript fail to unify type variables
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
name: Bug
about: Create a report to help us improve TypeScript
title: Typescript fail to unify type variables
labels: ''
assignees: ''
Bug Report
🔎 Search Terms
unify type variables, unification, type inference.
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about Generics.
⏯ Playground Link
Playground link with relevant code
💻 Code
class Var {
id: number
name: string
static counter = 0
constructor(name: string) {
this.id = Var.counter++
this.name = name
}
}
function v(strs: TemplateStringsArray): Var {
const [name] = strs
return new Var(name)
}
type Logical<T> = Var | { [P in keyof T]: Logical<T[P]> }
type List<T> = null | { head: T; tail: List<T> }
function cons<T>(head: Logical<T>, tail: Logical<List<T>>): Logical<List<T>> {
return { head, tail }
}
function test(element: Logical<string>, list: Logical<List<string>>): void {
}
// This is Ok.
test("a", cons<string>(v`element`, v`tail`))
// But this is not Ok.
test("a", cons(v`element`, v`tail`))
🙁 Actual behavior
When I do not write the annotation for cons, an error occured:
Argument of type 'Logical<List<{ id: { toString: ...; toFixed: ...; toExponential: ...; toPrecision: ...; valueOf: ...; toLocaleString: ...; }; name: { toString: ...; charAt: ...; charCodeAt: ...; concat: ...; indexOf: ...; lastIndexOf: ...; ... 43 more ...; at: ...; }; }>>' is not assignable to parameter of type 'Logical<List<string>>'.
Type '{ head: Logical<{ id: { toString: ...; toFixed: ...; toExponential: ...; toPrecision: ...; valueOf: ...; toLocaleString: ...; }; name: { toString: ...; charAt: ...; charCodeAt: ...; concat: ...; indexOf: ...; lastIndexOf: ...; ... 43 more ...; at: ...; }; }>; tail: Logical<...>; }' is not assignable to type 'Logical<List<string>>'.
Type '{ head: Logical<{ id: { toString: ...; toFixed: ...; toExponential: ...; toPrecision: ...; valueOf: ...; toLocaleString: ...; }; name: { toString: ...; charAt: ...; charCodeAt: ...; concat: ...; indexOf: ...; lastIndexOf: ...; ... 43 more ...; at: ...; }; }>; tail: Logical<...>; }' is not assignable to type '{ head: Logical<string>; tail: Logical<List<string>>; }'.
Types of property 'head' are incompatible.
Type 'Logical<{ id: { toString: ...; toFixed: ...; toExponential: ...; toPrecision: ...; valueOf: ...; toLocaleString: ...; }; name: { toString: ...; charAt: ...; charCodeAt: ...; concat: ...; indexOf: ...; lastIndexOf: ...; ... 43 more ...; at: ...; }; }>' is not assignable to type 'Logical<string>'.
Type '{ id: Logical<{ toString: unknown; toFixed: unknown; toExponential: unknown; toPrecision: unknown; valueOf: unknown; toLocaleString: unknown; }>; name: Logical<{ toString: unknown; charAt: unknown; charCodeAt: unknown; concat: unknown; indexOf: unknown; lastIndexOf: unknown; localeCompare: unknown; ... 42 more ...; ...' is not assignable to type 'Logical<string>'.
Type '{ id: Logical<{ toString: unknown; toFixed: unknown; toExponential: unknown; toPrecision: unknown; valueOf: unknown; toLocaleString: unknown; }>; name: Logical<{ toString: unknown; charAt: unknown; charCodeAt: unknown; concat: unknown; indexOf: unknown; lastIndexOf: unknown; localeCompare: unknown; ... 42 more ...; ...' is not assignable to type 'Var'.
Types of property 'id' are incompatible.
Type 'Logical<{ toString: unknown; toFixed: unknown; toExponential: unknown; toPrecision: unknown; valueOf: unknown; toLocaleString: unknown; }>' is not assignable to type 'number'.
Type 'Var' is not assignable to type 'number'.
37 test("a", cons(v`element`, v`tail`))
~~~~~~~~~~~~~~~~~~~~~~~~~
🙂 Expected behavior
I expect type checker inference the type annotation for me, so I can write:
test("a", cons(v`element`, v`tail`))
Instead of:
test("a", cons<string>(v`element`, v`tail`))
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 comportamento nel TypeScript Playground collegato e confronta l’argomento di tipo esplicito su cons con la chiamata inferita in test. Inizia esaminando come interagiscono i tipi generici cons, Logical e List; il lavoro è completo quando la chiamata senza annotazioni viene accettata con il tipo atteso basato su string.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100