首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否可以使用T扩展Contravariant<any>来安全地将泛型类型约束为反变体联合

我是否可以使用T扩展Contravariant<any>来安全地将泛型类型约束为反变体联合
EN

Stack Overflow用户
提问于 2022-07-17 16:22:35
回答 1查看 33关注 0票数 0

让我们从一些定义开始:

代码语言:javascript
复制
type Contravariant<T> = (t: T) => void;
declare let cNum: Contravariant<number>;
declare let cStr: Contravariant<string>;

现在,假设我想要创建一个函数,可以在一个Contravariant联合类型的数组中传递它。首先,我使用了一个简单的方法:

代码语言:javascript
复制
declare function f1<T>(a: T[]): void;
f1([cNum, cStr]); // T inferred as 'Contravariant<number> | Contravariant<string>'

看起来不错!但是,数组目前可以采用任何类型,我想将其限制为Contravariant类型,因此让T扩展Contravariant

代码语言:javascript
复制
declare function f2<T extends Contravariant<any>>(a: T[]): void;
f2([cNum, cStr]); // T inferred as 'Contravariant<number> | Contravariant<string>'

似乎效果不错。然而,eslint现在抱怨使用anyunknown显然不起作用,因为它是反变体。

在这种情况下使用any有哪些潜在的缺点?我能安全地使用any吗?在不使用any的情况下,有什么方法可以做到吗?

我尝试过的其他一些事情:

代码语言:javascript
复制
declare function f3<T extends Contravariant<U>, U>(a: T[]): void;
f3([cNum, cStr]);
// Type 'Contravariant<number>' is not assignable to type 'Contravariant<unknown>'.
//  Type 'unknown' is not assignable to type 'number'.
代码语言:javascript
复制
declare function f3a<U>(a: Contravariant<U>[]): void;
f3a([cNum, cStr]);
// Type 'Contravariant<string>' is not assignable to type 'Contravariant<number>'.
//   Type 'number' is not assignable to type 'string'.
代码语言:javascript
复制
declare function f4<T extends Contravariant<T extends Contravariant<infer I> ? I : never>>(a: T[]): void;
f4([cNum, cStr]);
// Type 'Contravariant<string>' is not assignable to type 'Contravariant<string | number>'.
//   Type 'string | number' is not assignable to type 'string'.
//     Type 'number' is not assignable to type 'string'.

为什么所有这些(f3,f3a,f4)都会导致不同类型的推断?他们看起来都对我做了同样的事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-17 17:31:50

我看不出在这里使用any有什么坏处。毕竟,它只是用于约束。但是,如果您确实需要一个没有any的解决方案,您可能会对以下内容感兴趣:

代码语言:javascript
复制
declare function f1<
  T extends unknown[]
>(a: [...{ [K in keyof T]: Contravariant<T[K]> }]): void;

f1([cNum, cStr]);

在本例中,T将被推断为[number, string]

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73013460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档