Variadic tuple inference does not work well with generics (e.g. currying array)

Aperta
#41,136 0 commenti 2 reazioni 1 assegnatario Vedi su GitHub

@ahejlsberg ci sta già lavorando.

Dal 3/11/2020.

Valutazione

Questa issue non è ancora stata valutata.

Descrizione

Needs Investigation

TypeScript Version: 4.1.0-dev.20201015 (also 4.0.3)

Search Terms: variadic tuples, generics, curry, inference

Code

function curry<T extends unknown[], U extends unknown[], R>(f: (...args: [...T, ...U]) => R, ...a: T) {
    return (...b: U) => f(...a, ...b);
}

function _map<T, U>(mapFn: (t: T) => U, array: Array<T>): Array<U> {
  return array.map(mapFn);
}

const map1 = curry(_map);
const map2 = curry(_map, (s: string) => s.length);
const map3 = curry(_map, (s: string) => s.length, ['a', 'bravo'])

Expected behavior:

  • map1 should resolve to the type <T, U>(mapFn: (t: T) => U, array: Array<T>) => U
  • map2 should resolve to the type <T, U>(array: Array<T>) => U

Actual behavior:

  • map1 has _map unassignable to the first argument, with the error:

    Argument of type '<T, U>(mapFn: (t: T) => U, array: T[]) => U[]' is not assignable to parameter of type '(...args: unknown[]) => unknown[]'.
    Types of parameters 'mapFn' and 'args' are incompatible.
    Type 'unknown' is not assignable to type '(t: unknown) => unknown'.

  • map2 has _map unassignable to the first argument, with the error:

    Argument of type '<T, U>(mapFn: (t: T) => U, array: T[]) => U[]' is not assignable to parameter of type '(args_0: (s: string) => number, ...args_1: unknown[]) => number[]'.
    Types of parameters 'array' and 'args_1' are incompatible.
    Type 'unknown' is not assignable to type 'string[]'.

When inverting the order of _map to be data-first, map-function last, it has the same assignability issues (playground).

Playground Link: https://www.typescriptlang.org/play?ts=4.1.0-dev.20201015#code/GYVwdgxgLglg9mABBEAnVBPAPAFUQUwA8p8wATAZ0XAGsw4B3MAbQF0AaRAVQONMupg6jFh0QAlAHwAKYAC5E0gHQqAhqgDmFBcxVKcnPV1YBKRAF5JEw2oU4zAbwCwAKETvEqfFDRJlKgCMFLjNLRGB-JVUbJQCTAG5XAF9XV1BIWAREAH0AW1UAB1xOLhl8goAxMAVpKDtQqy5OdVRVDAUAQXQ23EkTTu7sUsRnN09vX0QWtqVy6XKqhOTUlwgECihEcoBGC2Q0TGk8wqXV9c3ygCY9lHQMI-LOaW1EDdQYMA0G16UAG1INFAABanNZgDZbQoAZhuB3uxwKTxebw+XwsVgofwBwM4zAA5Ko8Zw8QFWgA3OB40wrIA

Related Issues:

  • #39713
  • #39244
Lingua principale
Go
Stelle
111k
Fork
14.4k
Merge medio
1g 19h
PR unite (30g)
117

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/TypeScript

Tutte le issue di microsoft/TypeScript

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.