typescript - 通用参数限制为非数组

标签 typescript generics

有没有办法说方法的传递类型参数不能是数组??

示例类

class A {
  public f<T /*which is not array*/>(obj: T) { /* ... */ }
}

这段代码不会被编译:

const a = new A();

a.f<number[]>([42, 42]);

最佳答案

是的,有:

class A {
  public f<T>(obj: T extends Array<any> ? never : T) { /* ... */ }
}

const x = new A();
x.f(1) // ok
x.f([]) // error
x.f([1]) // error

顺便说一句,TypeScript 中没有否定类型。例如,你不能这样写:not Array<any>!Array<any> , 但 TS 有条件类型。

在我的示例中,我返回了 never如果参数是数组。

这是什么意思?

这意味着,TS 会期待与 never 的一个参数类型。

诀窍是,您无法生成 never按字面输入。

您可以创建自己的否定类型:

type Not<T,  R> =  R extends T ? never: R;

谢谢@Eldar!

关于typescript - 通用参数限制为非数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66745644/

相关文章:

c# - 将派生类转换为基类可以在使用泛型时保留派生知识

java - 从java中的接口(interface)实现泛型方法

TypeScript:如何在不指定模板参数的情况下使用模板化类型?

java - 无法构造泛型类型参数,该怎么办?

java - 使用泛型方法检查对象是否在数组中

typescript - Vue Router 元字段

java - Java 泛型的 'E' 、 'T' 和 '?' 有什么区别?

传播可选键时的 typescript 警告

typescript - 什么是 Vue 3 组合 API 定义方法的类型安全方式

javascript - Typescript:将*一些*(不是全部)属性从一个类实例复制到另一个对象的最佳方法是什么?