你能让 TS 从被赋值的值中推断出变量的泛型类型参数吗?

时间:2021-04-08 11:31:07

标签: typescript typescript-generics

回答 this question 的解决方案是在 cordova-plugin-splashscreen 构造函数上指定类型参数,如下所示:

Map

请注意,OP 想要给 const conditions3: ReadonlyMap<string, any> = new Map<string, any>([ // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^ [FirstName.Alex, 'foo'], [Lastname.Smith, 'bar'] ]); 类型 conditions3,而不仅仅是 ReadonlyMap<string, any>;否则我们可以完全从 Map<string, any> 中删除类型注释。

不幸的是,这意味着在 conditions3ReadonlyMap 上重复类型参数。

一般情况下,有没有办法告诉 TypeScript 从值的类型参数推断变量/常量类型(在本例中为 Map)的类型参数被分配(在本例中为 ReadonlyMap)?我的意思不是针对这种特定情况的解决方案(我想我可能有一个函数,也许是一个从字面上提供只读地图的函数,至少在开发版本中),而是一个通用的从目标推断的解决方案?

我的各种幼稚方法都不起作用(前两个受 Java 的 Map 启发):

<>

playground link

const conditions3: ReadonlyMap<> = new Map<string, any>([
//                 ^^^^^^^^^^^^^−−−−− Generic type 'ReadonlyMap<K, V>' requires
//                                    2 type argument(s).(2314)
    [FirstName.Alex, 'foo'],
    [Lastname.Smith, 'bar']
]);

playground link

const conditions3: ReadonlyMap<string, any> = new Map<>([
// Same error with no matching overloads the OP had −^^
    [FirstName.Alex, 'foo'],
    [Lastname.Smith, 'bar']
]);

playground link

在一般情况下是否可以避免重复?

这是设置代码(所以它在问题中,而不仅仅是链接):

const conditions3: ReadonlyMap = new Map<string, any>([
//                 ^^^^^^^^^^^−−−−− Generic type 'ReadonlyMap<K, V>' requires
//                                  2 type argument(s).(2314)
    [FirstName.Alex, 'foo'],
    [Lastname.Smith, 'bar']
]);

1 个答案:

答案 0 :(得分:2)

不幸的是,变量中没有用于部分推断的语法。

唯一的解决方法是使用您在评论中提到的函数:

function roMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> { return map; } 

const conditions3 = roMap(new Map<string, any>([
    [FirstName.Alex, 'foo'],
    [Lastname.Smith, 'bar']
]));

Playground Link

相关问题