为泛型函数专门化一个类型

2024-01-16

鉴于这个定义:

declare function foo<T>(): { bar: T }

// <T>() => { bar: T }
type Foo = typeof foo;

如何通过类型为泛型函数提供专门化?

我想要实现的是能够做这样的事情:

// { bar: number }
type FooResult = ReturnType<Foo<number>>;

但 TypeScript 抱怨说Foo它本身不是泛型的——它输入的函数是泛型的。


TypeScript 并不真正支持您需要从中获取此信息的高阶类型ReturnType... 它是已知的设计限制 https://github.com/Microsoft/TypeScript/issues/22617#issuecomment-375123727。因此,您所能利用的就是各种解决方法。以下是我能立即想到的:

  • 手动执行。这本质上是一个非答案,但可能是最好的前进方式,因为它不依赖于任何奇怪的类型系统技巧:

    type FooResult<T> = { bar: T };
    type FooResultNumber = FooResult<number>; // {bar: number}
    
  • 假装真的打电话foo()并得到它的结果。打字稿不支持任意类型查询 https://github.com/microsoft/TypeScript/issues/6606, so type FooResult = typeof foo<number>()不幸的是无法编译。以下代码是您能得到的最接近的代码:

    const __dummy = (true as false) || foo<number>();
    type FooResultNumber = typeof __dummy; // {bar: number}
    

    这会在运行时代码中引入一个虚拟变量。这(true as false) || expression构造使用一个类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions对编译器撒谎。编译器认为你正在做false || expression,其类型将与expression。你在运行时真正做的是true || expression短路,返回true从未评估过expression。这意味着foo()尽管在代码中,但在运行时永远不会被调用。

  • 另一种假装打电话的方法foo()是一个虚拟类...您永远不会实例化该类,但它可以让编译器推理类型:

    class __FooRunner<T> {
      result = foo<T>();
    }
    type FooResult<T> = __FooRunner<T>["result"];
    type FooResultNumber = FooResult<number>; // {bar: number}
    

    同样,这会在您的运行时代码中放入一些垃圾,这可能会也可能不会被接受,具体取决于您的用例。

好的,希望有帮助;祝你好运!

链接到代码 http://www.typescriptlang.org/play/index.html#code/HYQwtgpgzgDiDGEAEBZEwCuIA2SDeAsAFBJIAmE82IATsgGYbDwAuAlgPbBL0ccA8AFQB8ACgCUALnxIARrWmCkAXwDcxUiwCeMZADE+AJWgZsLIcKQBeGfJqKV6kkm26kBjsaimWAOQxgshA01u5GJmb8mIHBwqpIAPQJ+HbS0UE0ysRZRMSgkLAIyAAiAWBaAGq0bCCy2MiEzhRUtAxMrJzcvAIiEtJ4cgpISmoaSPBcUCxIAPozZGVaoaIsNBjIIFA8OFAQ4kgAPgc8fFEBGWLiTpo6+uHeZv4xITauEBz0s-OL8UkpQ+lgjkcnlwNA4IgkKUwOUAMLUKBbRqkZrUOg8drsLgnHqXfqDezDRxjFqIr4eQxMYDBCz4MakOgPaY2boWCTXFRjN5hTwRcwiUJzClUmkiADaACJGT4JQBdDncil8p4ZUJKplnZ5xRLJPCpJCAzLZYjEIA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为泛型函数专门化一个类型 的相关文章

随机推荐