返回类型别名的泛型类型



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

最新更新