Typescript 类型脚本:泛型约束导致类型推断选择错误的候选对象?
类型脚本版本:2.6.0-dev.20170826和2.4.2 我想知道我是否遇到了一些typescript推断错误/限制,或者我的代码是否完全不正确。如果代码实际有效,并且是类型推断问题,我将向typescript github报告一个bug 我试图限制Typescript 类型脚本:泛型约束导致类型推断选择错误的候选对象?,typescript,generics,Typescript,Generics,类型脚本版本:2.6.0-dev.20170826和2.4.2 我想知道我是否遇到了一些typescript推断错误/限制,或者我的代码是否完全不正确。如果代码实际有效,并且是类型推断问题,我将向typescript github报告一个bug 我试图限制集合生成器只接受正确定义了相等性的类型(以避免) 奇怪的d.ts declare module 'strange' { export type WithEquality = string|number|boolean|{equals(o
集合
生成器只接受正确定义了相等性的类型(以避免)
奇怪的d.ts
declare module 'strange' {
export type WithEquality = string|number|boolean|{equals(other: any): boolean; hashCode(): number;};
export interface Set<T> {
add(other: T): Set<T>;
}
export function makeSetUnsafe<V>(...vals: V[]): Set<V>;
export function makeSet<V extends WithEquality>(...vals: V[]): Set<V>;
}
///<reference path="./strange.d.ts"/>
import * as S from 'strange';
const x = S.makeSetUnsafe(1,2,3);
x.add(4);
const y = S.makeSet(1,2,3);
y.add(4);
添加泛型约束以检查Set
接口的泛型类型是否扩展了WithEquality
会导致推理为T
选择1 | 2 | 3
,而不是number
用consty=S.makeSet(1,2,3)显式给出类型代码>使其生成,因此添加泛型约束似乎使类型推断选择另一种类型
事实上,即使使用更简单的
export type WithEquality = number;
一个好的答案可以解释为什么这段代码是错误的,希望给出一个typescript实现,允许在类型推断工作的情况下表达这些约束,或者确认这是typescript限制。至于为什么会发生这种情况,请查看此问题的答案:
您可以这样修复它:
export function makeSet<V>(...vals: Array<V & WithEquality>): Set<V>;
至于发生这种情况的原因,请查看此问题的答案:
您可以这样修复它:
export function makeSet<V>(...vals: Array<V & WithEquality>): Set<V>;
const y = makeSet2(1,2,3);
y.add(4); // fine
const z = makeSet(/a*/); // error