微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在打字稿中测试另一个泛型类型的泛型吗?

如何解决我可以在打字稿中测试另一个泛型类型的泛型吗?

假设我有一个泛型类型,例如 type A<X,Y,Z> = {}。我可以创建一个测试函数来检测输入值的具体类型扩展这个 type A 吗?

type A<X,Z> = {}

const a : A<number,string,boolean>

function test<T extends A>(toTest:T) {
  // Can I test type X,Z of input value here?
}

test(a)

解决方法

有点难说,但我想你想要这样的东西?

type A<X,Y,Z> = {}

declare function test<T extends A<unknown,unknown,unknown>>(toTest: T):
  T extends A<infer X,infer Y,infer Z>
    ? X extends string
      ? true
      : false
    : false

declare const a: A<number,string,boolean>
test(a) // false,X is not a string

declare const b: A<string,boolean>
test(b) // true,X is a string

让我们分解一下。


首先是通用约束:

function test<T extends A<unknown,unknown>>(toTest: T)

A 类型的泛型参数必须有值,但您不必承诺这些值是什么。此处的 unknown 仅用作占位符,可让您传入任何内容。


接下来是这个嵌套的条件类型:

  T extends A<infer X,infer Z>
    ? X extends string
      ? true
      : false
    : never

这个函数的返回类型是我们可以提取那些泛型参数的地方。

第一个说如果 TA<any,any,any> 的子类型,那么推断这些槽中每个泛型参数的类型。然后,您可以在条件类型的 ? 之后使用这些类型。

如果 T 不扩展 A<any,any> 则它跳到最后一行并变成 never。虽然在这种情况下,这不可能发生,因为约束可以分配给这种类型。但这是使用 infer SomeType 所需的语法。

现在我们可以对其中一种类型进行测试。在这种情况下,我们测试它是否是带有 stringX extends string。如果是字符串,则类型变为true,否则变为false

Playground


实现这个功能是另一回事,我纯粹是在回答这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?