【问题标题】:How can I generically type variable bindings in TypeScript?如何在 TypeScript 中通用地键入变量绑定?
【发布时间】:2018-10-15 04:01:14
【问题描述】:

我有一个通用接口可供我使用:

CurriedFunction3<T1, T2, T3, R>: R

我想创建一个 const 绑定来填充其中一些类型参数。像这样的:

type CurriedSorter<T> = CurriedFunction3<(obj: T) => any, string, T[], T[]>;

但是,当我尝试分配 const 绑定此类型时,出现错误:

type CurriedSorter<T> = CurriedFunction3<(obj: T) => any, string, T[], T[]>;

const sortFactory: CurriedSorter = uncurryN(3, flip(compose(
  unapply(sortWith),
  uncurryN(2, ifElse(
    compose(equals('DESC'), toUpper),
    always(descend),
    always(ascend),
  )),
)));

通用类型 CurriedSorter 需要 1 个类型参数。

const 绑定 sortFactory 应该是一个具有一个泛型类型参数的函数,可以这样使用:

sortFactory<MyType>(
  prop('name'),
  'DESC',
  [{ name: 'foo' }, { name: 'bar' }]
) // returns `[{ name: 'bar' }, { name: 'foo' }]`

如何在 TypeScript 中通用地键入变量绑定?有什么办法可以用 TypeScript 做到这一点?

【问题讨论】:

  • sortFactory 的类型是什么?您是否尝试在 const sortFactory: CurriedSorter&lt;T&gt; 中提及 T
  • sortFactory 应该是CurriedSorter&lt;T&gt;,即接受一种泛型类型传递给CurriedSorter。我不确定如何在const sortFactory 中提及T,这就是这个问题的意义所在。当我做const sortFactory: CurriedSorter&lt;T&gt; 时,我收到一个错误“找不到名称'T'”。

标签: javascript typescript ramda.js


【解决方案1】:

您不能在变量声明的类型中使用裸 T,因为 T 可能会通过属性从值中泄漏出来。但是,您可以将通用 调用签名 作为变量类型的一部分。这是一个独立的示例,因为我不知道您将 uncurryNunapply 等定义为:

type CurriedFunction3<T1, T2, T3, R> = (a: T1, b: T2, c: T3) => R;

type CurriedSorter<T> = CurriedFunction3<(obj: T) => any, string, T[], T[]>;

type CurriedSorterValue = {
    <T>(a: (obj: T) => any, b: string, c: T[]): T[];
}

const sortFactory: CurriedSorterValue = function (a, b, c) {
    return c;
}

【讨论】:

  • 这里的generic call signature 是什么意思?这是否意味着声明一个实际上是具有通用签名的函数类型的类型?喜欢type CurriedSorterValue
  • 对; &lt;T&gt;(a: (obj: T) =&gt; any, b: string, c: T[]): T[]; 是泛型调用签名(可能包含在非泛型类型中),而CurriedSorter&lt;T&gt; 是泛型类型。
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2016-09-07
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多