【发布时间】:2021-07-31 20:22:05
【问题描述】:
我有一个带有两个泛型参数的类型
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;
};
【问题讨论】:
-
您指的还有哪些其他属性?请提供其他属性的示例
-
FirstLevelType<A,Z>对A或Z没有结构依赖是否有原因?这样做很麻烦,因为FirstLevelType<string, number>等价于FirstLevelType<boolean, Date>,因此类型参数的推断是个问题。我看到您已经接受了有关更改为界面的答案,但我希望这很脆弱。如果你想要更健壮的类型推断,最好将A和Z类型的成员添加到FirstLevelType<A,Z>。 -
@jcalz 使用这些泛型是因为它们与继承的FirstLevelType 对象没有直接关系,但有用于动态创建类方法,其中A 是参数,Z 是返回,对象的相关键
Record<string, FirstLevelType<A,Z>>是方法名。 -
但是你没有使用参数;见this FAQ entry。
-
这与其说是“规则”,不如说是防止推理异常的保险。也许没有它你的代码可以正常工作,但也许有一天你的使用或编译器实现会发生一些变化,导致结构检查,然后问题会再次出现。如果它对你有用,你不一定要改变它,但你至少应该意识到这个问题。
标签: javascript typescript