typescript - 如何创建仅接受具有特定嵌套类型的类型实例的泛型函数?

标签 typescript

更新
我自己做了一个走查,通过将嵌套类型从静态字段移动到即时字段,这似乎有效但不完美:https://tsplay.dev/w26Xjw

更新
主要目的是:

  • 我想创建一个通用函数,它接受两个参数;
  • 这些参数的类型可以是 connected/related
  • 当我将第一个参数传递给 T 的类型时,它应该自动推断第二个参数的类型 U

  • 所以问题是:
  • 如何正确地使这两种类型连接/相关?我尝试使用嵌套类型,如下面我之前的帖子,这可能不是一种合适的方式,但我不知道如何。欢迎任何建议。
  • 一旦这些类型连接/相关,如果可能的话,是否可以从第一个类型自动推断后一个类型?

  • 这样当用户传递第一个参数时,泛型函数应该限制第二个参数的类型。
    我想在 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.ParamB.Param所以它们不会有相同的形状。否则,由于它们的形状相同(空类),因此可以使用其中一个代替另一个。

    关于typescript - 如何创建仅接受具有特定嵌套类型的类型实例的泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68030997/

    相关文章:

    reactjs - .tsx webpack 编译失败 : Unexpected token <

    javascript - TypeScript 类 A 的方法作为 B 方法的传递

    Javascript,对象属性显示为未定义

    angular - Monorepo 中的 Jest 项目无法在项目中找到配置文件

    angular - Angular 动态切换模板html,scss

    typescript - TypeScript 中的 "not assignable to parameter of type never"错误是什么?

    c# - 是否有等同于 C# 属性的 TypeScript

    c# - 将具有一对多关系的 .Net 核心实体映射到 Angular 2 接口(interface)

    Typescript - 使用 Object.entries 动态更新对象属性

    javascript - 如何让 TS 编译器知道对象中存在函数?