Typescript如何推断组合的类型

Typescript如何推断组合的类型,typescript,Typescript,这与我上次的测试代码类似。 当我写问题的时候。我的IDE也有滞后和错误。 我不知道为什么我的IDE工作正常 我不是傻瓜,也许全世界都恨我。你的代码对我有用(链接太长,无法在评论中出现)。当我把你的代码粘贴到操场上时,我得到了ABC的类型,即HaveA&HaveB&HaveC。这不是你所期望的吗?我不明白问题的其余部分。是的,我预料到了。但这对我来说不管用。如果有&运算符,则不推断为基数。我得到了结果,但我不知道原因,我更改了每个流。然后我们需要找出您的环境的不同之处,导致代码行为不同。你用的是什

这与我上次的测试代码类似。 当我写问题的时候。我的IDE也有滞后和错误。
我不知道为什么我的IDE工作正常


我不是傻瓜,也许全世界都恨我。

你的代码对我有用(链接太长,无法在评论中出现)。

当我把你的代码粘贴到操场上时,我得到了
ABC
的类型,即
HaveA&HaveB&HaveC
。这不是你所期望的吗?我不明白问题的其余部分。是的,我预料到了。但这对我来说不管用。如果有
&
运算符,则不推断为基数。我得到了结果,但我不知道原因,我更改了每个流。然后我们需要找出您的环境的不同之处,导致代码行为不同。你用的是什么版本的TypeScript?@MattMcCutchen我做了错误的示例代码。实际上,原始类型以
null[&{}[&{}]]
开头。我想,如果组合类型在其中一个中有
Base
,它将正常工作。但是这是错误的,抱歉让你困惑。请更新原始代码块,以显示你正在使用的完整代码、你期望的类型以及你得到的实际类型。我已经复制了这些代码。真不敢相信结果。我在WebStorm和VisualStudio代码上测试了一整天。想见妈妈:(再次感谢。如果你知道如何将
中的
类型
更改为任何类型
作为动态构造函数,请告诉我。我想让
类型
类的子类重新定义自己。我不明白你的意思。请提交一个新问题,并提供一个清晰的示例,说明你希望代码执行的当前操作这是不行的。
interface Base<T> {
    values: T[];
}

interface HaveA<T> extends Base<T> {
    a?: number;
}

interface HaveB<T> extends Base<T> {
    b?: number;
}

interface HaveC<T> extends Base<T> {
    c?: number;
}

type SetA<V, X> = V extends Base<X> ? V & HaveA<X> : HaveA<V>;
type SetB<V, X> = V extends Base<X> ? V & HaveB<X> : HaveB<V>;
type SetC<V, X> = V extends Base<X> ? V & HaveC<X> : HaveC<V>;


type A = SetA<string, string>; // HaveA<string>, right
type AB = SetB<A, string>; // HaveA<string> & HaveC<string>, right
type ABC = SetC<AB, string>; // HaveC<string>, wrong
interface Base<T> {
    items: T[];
}

interface A<T> extends Base<T> {
    a: number;
}

interface B<T> extends Base<T> {
    b: number;
}

interface C<T> extends Base<T> {
    c: number;
}

type Arg<T, U> = T extends null ? U : T & U;
type DataA<T> = T extends { items: Array<infer X> } ? T & A<X> : A<T>;
type DataB<T> = T extends { items: Array<infer X> } ? T & B<X> : B<T>;
type DataC<T> = T extends { items: Array<infer X> } ? T & C<X> : C<T>;


class Types<T, U> {
    set<V>() {
        return this as any as Types<Arg<T, V>, U>;
    }

    setA() {
        return this as any as Types<Arg<T, { a: number }>, DataA<U>>;
    }

    setB() {
        return this as any as Types<Arg<T, { b: number }>, DataB<U>>;
    }

    setC() {
        return this as any as Types<Arg<T, { c: number }>, DataC<U>>;
    }

    test(t: T) {
    }

    test2(f: (args: U) => void) {
        f(<U>{});
    }
}

const types = new Types<null, number>();

types
    .set<null>()
    .set<{ foo: string }>()
    .set<{ bar: string }>()
    .setA()
    .setB()
    .setC()
    .test2(d => {});