通用参数被限制为非数组
有没有办法说方法的传递类型参数不能是数组?
示例类
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 中没有否定类型。例如,你不能写 smth like: not Array<any>or !Array<any>,但 TS 有条件类型。
在我的示例中,never如果参数是数组,我将返回。
这是什么意思?
这意味着,TS 将期望一个带有never类型的参数。
诀窍是,你不能never从字面上产生类型。
您可以创建自己的否定类型:
type Not<T, R> = R extends T ? never: R;
谢谢@Eldar!