通用参数被限制为非数组

Mat*_*bec 3 generics typescript

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

示例类

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

此代码不会被编译:

const a = new A();

a.f<number[]>([42, 42]);
Run Code Online (Sandbox Code Playgroud)

cap*_*ian 5

就在这里:

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
Run Code Online (Sandbox Code Playgroud)

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

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

这是什么意思?

这意味着,TS 将期望一个带有never类型的参数。

诀窍是,你不能never从字面上产生类型。

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

type Not<T,  R> =  R extends T ? never: R;
Run Code Online (Sandbox Code Playgroud)

谢谢@Eldar!