microsoft / microsoft/TypeScript

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

Open
#41,136 0 comments 2 reactions 1 assignee View on GitHub

@ahejlsberg is already working on this.

Since Nov 3, 2020.

Needs Investigation
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.