Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本:泛型约束导致类型推断选择错误的候选对象?_Typescript_Generics - Fatal编程技术网

Typescript 类型脚本:泛型约束导致类型推断选择错误的候选对象?

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

类型脚本版本:2.6.0-dev.20170826和2.4.2

我想知道我是否遇到了一些typescript推断错误/限制,或者我的代码是否完全不正确。如果代码实际有效,并且是类型推断问题,我将向typescript github报告一个bug

我试图限制
集合
生成器只接受正确定义了相等性的类型(以避免)

奇怪的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