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