[英]Typescript How to infer Combinded Types
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
我想從原始類型以任何組合形式輸入類型。 像A: {a}, B: {b}, C:{c}, AB:{a, b}, AC:{a, c}, BC:{b, c}, ABC: {a, b, c}
用於組合每種類型的&
運算符。 用於extends Base
,以確保該類型已擴展到任何字符。 但似乎不是檢查它的正確運算符。
如何檢查type
在type & type
? 除了使用&
之外,還有其他組合方式嗎?
我解決了使用'values' in keyof V
作為臨時方法。 某些接口可能沒有“值”。
添加:
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 => {});
這類似於我的上一個測試代碼。 當我寫問題時。 我的IDE也有滯后和錯誤。
我不知道我的IDE為什么能正常工作。
我不是傻瓜,也許世界恨我
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.