Typescript 替换泛型接口类型参数

Typescript 替换泛型接口类型参数,typescript,typescript-generics,Typescript,Typescript Generics,我正在尝试为函子映射创建一个通用函数接口,它尊重提供的接口。在下面显示的代码中,我希望mb的值是类型Maybe,而不是实际类型Functor 我确实意识到一个可能的解决方案是在接口FMap中添加重载。我不满意此解决方案的原因是,我希望此代码驻留在一个包中,允许用户为Functor创建实现,并在使用函数map时具有上述行为 接口函子{ 映射(fn:(a:a)=>B):函子; } 接口FMap{ (fn:(a:a)=>B,Fa:函子):函子; } 常数映射:FMap=(fn,Fa)=>( Fa.地图

我正在尝试为函子映射创建一个通用函数接口,它尊重提供的接口。在下面显示的代码中,我希望
mb
的值是类型
Maybe
,而不是实际类型
Functor

我确实意识到一个可能的解决方案是在接口
FMap
中添加重载。我不满意此解决方案的原因是,我希望此代码驻留在一个包中,允许用户为
Functor
创建实现,并在使用函数
map
时具有上述行为

接口函子{
映射(fn:(a:a)=>B):函子;
}
接口FMap{
(fn:(a:a)=>B,Fa:函子):函子;
}
常数映射:FMap=(fn,Fa)=>(
Fa.地图(fn)
);
类可能实现函子{
构造函数(私有只读a:a){}
地图(fn:(a:a)=>B):也许{
返回新的Maybe(fn(this.a));
}
}
常量sqr=(x:number)=>x*x;
常数ma=新的可能(5);
常数mb=map(sqr,ma);
我想要一些表达以下语义的方法:

//理论代码
接口FMAP{
(fn:(a:a)=>B,Fa:Fa):Fa扩展(推断F)?F:从不;
}
但是,作为一个泛型接口,如果没有类型参数,则该类型不起作用。例如,
Functor
等接口要求将类型参数视为类型,而
Functor
本身则不是有效的类型

如果目前还没有表达这些语义的方法,任何关于解决方案的建议都将非常感谢,该解决方案需要用户尽可能少的代码


提前感谢您的时间和考虑。

阻碍我们前进的是,当您试图将类型变量
F
作为类型参数传递给另一个类型变量
T
,例如
T
,即使您知道
T
实际上是一个通用接口,TS也不允许这样做

在github的一期中,有一个关于这个主题的讨论可以追溯到2014年,现在仍然开放,所以TS团队在不久的将来可能不会支持它

此语言功能的术语称为。使用这个搜索关键词,谷歌带我去兔子洞旅行

事实证明存在一个非常聪明的解决方法

通过利用TS(又名模块增强)特性,我们可以有效地定义一个空的“类型存储”接口,它的行为就像一个普通对象,保存对其他有用类型的引用。使用这种技术,我们能够克服这个拦截器

我将以您的案例为例介绍此技术的思想。如果你想深入研究,我会在最后提供一些有用的链接

以下是(剧透警报)的最终结果。一定要在现场观看。现在让我们一步一步地分解它(或者我应该说构建它?)

  • 首先,让我们声明一个空的
    TypeStore
    接口,稍后我们将更新它的内容
  • //把它想象成一个普通的对象
    接口类型库
    

  • 阻碍我们的是,当您试图将一个类型变量
    F
    作为类型参数传递给另一个类型变量
    T
    ,就像
    T
    ,即使您知道
    T
    实际上是一个通用接口,TS也不允许这样做

    在github的一期中,有一个关于这个主题的讨论可以追溯到2014年,现在仍然开放,所以TS团队在不久的将来可能不会支持它

    此语言功能的术语称为。使用这个搜索关键词,谷歌带我去兔子洞旅行

    事实证明存在一个非常聪明的解决方法

    通过利用TS(又名模块增强)特性,我们可以有效地定义一个空的“类型存储”接口,它的行为就像一个普通对象,保存对其他有用类型的引用。使用这种技术,我们能够克服这个拦截器

    我将以您的案例为例介绍此技术的思想。如果你想深入研究,我会在最后提供一些有用的链接

    以下是(剧透警报)的最终结果。一定要在现场观看。现在让我们一步一步地分解它(或者我应该说构建它?)

  • 首先,让我们声明一个空的
    TypeStore
    接口,稍后我们将更新它的内容
  • //把它想象成一个普通的对象
    接口类型库
    

  • 在您的示例中,您希望推断出
    F
    是什么?在
    map(sqr,ma)
    的情况下,我希望推断出
    可能是
    。但这显然不起作用,因为
    可能本身不是一种类型。我想保留为
    映射提供的具体实现,而不是返回
    Functor
    。已经讨论过了,现在可能无法正确执行。@hackape非常感谢这个链接!我一直在搜索这些问题,但没有合适的词汇表来找到任何有用的东西。嗯,看起来值得重新发布作为答案。在您的示例中,您希望推断出
    F
    是什么?我希望在
    map(sqr,ma)
    的情况下推断出
    可能是
    。但这显然不起作用,因为
    可能本身不是一种类型。我想保留为
    映射提供的具体实现,而不是返回
    Functor
    。已经讨论过了,现在可能无法正确执行。@hackape非常感谢这个链接!我一直在搜索这些问题,但没有合适的词汇来找到任何有用的东西。嗯,看起来值得转载作为答案。