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

未关闭
#41,136 0 条评论 2 个 reaction 已指派 1 人 在 GitHub 查看

@ahejlsberg 已经在做这个了。

开始于 2020年11月3日。

评估

这个 Issue 还没有评估数据。

描述

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
主要语言
Go
星标
111k
派生
14.4k
平均合并
1 天 19 小时
30 天内合并 PR
117

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

microsoft/TypeScript 的其他 Issue

查看 microsoft/TypeScript 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。