更新
我自己做了一个走查,通过将嵌套类型从静态字段移动到即时字段,这似乎有效但不完美:https://tsplay.dev/w26Xjw
更新
主要目的是:
connected/related
所以问题是:
这样当用户传递第一个参数时,泛型函数应该限制第二个参数的类型。
我想在 C++ 中写一些类似的东西:
class A {
class InnerType {}
}
template<typename T>
void test(const T& first, const typename T::InnerType& second);
我想创建一个接受两个参数的通用函数:
T
的类型并且会有一个嵌套类型 T.Param
T.Param
的类型class A {
static Param = class {
....
}
}
class B {
static Param = class {
....
}
}
// How can I make the T/P match the requirements explain above?
function test<T, P>(first:T, second:P) {
}
然后这样的调用应该通过:test(new A(), new A.Param()); // OK
test(new A(), new B.Param()); // Fail
test(new B(), new A.Param()); // Fail
test(new B(), new B.Param()); // OK
最佳答案
有几种不同的方法可以做到这一点,部分取决于您想要驱动该过程的参数。您可以使用第一个参数来驱动它:
function test1<T extends {Param: unknown}, P extends T["Param"]>(first: T, second: P) {
// ...
}
或第二个:function test2<P, T extends {Param: P}>(first: T, second: P) {
// ...
}
有了这些,你会得到这些结果:test1(A, A.Param); // works
test1(B, A.Param); // error on second argument
test2(A, A.Param); // works
test2(B, A.Param); // error on first argument
Playground with both请注意,因为 TypeScript 的类型系统是结构性的(基于类型的形状)而不是名义上的(基于类型的名称),所以我在操场链接中添加了一些内容到
A.Param
和 B.Param
所以它们不会有相同的形状。否则,由于它们的形状相同(空类),因此可以使用其中一个代替另一个。
关于typescript - 如何创建仅接受具有特定嵌套类型的类型实例的泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68030997/