I Have A Type with two generic parameters
type FirstLevelType<A, Z> = {
_: "typeCheck";
};
但我需要用另一个包裹这种类型
type TestWrapperType<T, U> = FirstLevelType<T, U>;
使用TestWrapperType创建变量后,我需要获得泛型参数。
const a: TestWrapperType<{ cat: string }, { dog: number }> = {
_: "typeCheck",
};
但我只能使用FirstLevelType来防止代码长度增长,因为包装器类型可以创建多次。
type ExtendFirst = typeof a extends FirstLevelType<infer T, infer U>
? T
: "not extended";
结果类型=未知
例外类型={cat:string}
type ExtendWrapper = typeof a extends TestWrapperType<infer T, infer U>
? T
: "not extended";
结果类型={cat:string}
例外类型={cat:string}
为什么ExtendFirst类型未知?我该如何解决这个问题。
[更新1]
如果FirstLevelType声明为接口,则Resulted Type何时正确。然而,当我的包装器有其他属性时,结果类型再次未知。
type TestWrapperType<T, U> = FirstLevelType<T, U> & {
seal?: boolean;
};
如果您想让它工作,只需将interface
用于FirstLevelType
而不是type
。
// used interface instead of type
interface FirstLevelType<A, Z> {
_: "typeCheck";
};
type TestWrapperType<T, U> = FirstLevelType<T, U>;
const a: TestWrapperType<{ cat: string }, { dog: number }> = {
_: "typeCheck",
};
type ExtendFirst = typeof a extends FirstLevelType<infer T, infer _>
? T
: "not extended";
type ExtendWrapper = typeof a extends TestWrapperType<infer T, infer _>
? T
: "not extended";
游乐场
我相信这是因为接口在types
-急切地进行评估时是懒惰的。
如果FirstLevelType被声明为接口,则Resulted Type何时正确。然而,当我的包装器有其他属性时,结果类型再次未知。
由于你的TestWrapperType
可能会被扩展,你应该推断出这些rest
道具:
type FirstLevelType<A, Z> = {
_: "typeCheck";
};
type TestWrapperType<T, U> = FirstLevelType<T, U> & {
seal?: boolean;
}
const a: TestWrapperType<{ cat: string }, { dog: number }> = {
_: "typeCheck",
};
// { cat: string; }
type ExtendFirst = typeof a extends FirstLevelType<infer T, infer _> & infer RestProps
? T
: "not extended";
现在您可以将type
用于FirstLevelType