typescript泛型类怎么根据泛型参数来禁止某些方法的调用?

class Foo<T>
{
    //上面已经写了几百个函数和变量了。
    //突然想到,如果T是number类型的话,可以有一个foo函数就好了
    //但是如果T不是number类型的话,希望调用foo能被禁止。
    foo(){
    }
}

我希望只有当Tnumber的时候,foo才能被调用。否则调用foo就是错误可以吗?

有个简单的办法是:

class Foo<T>
{
    foo: T extends number ? () => void : never = (() =>
    {

    }) as any;
}

但是我希望使用最上面示例的那种一般的方法定义的语法。因为这种方法定义函数的时候,语法奇葩,需要as any,还没有定义在prototype上面。

阅读 1.7k
2 个回答

假设这个文件是 Foo.ts,那么需要再建一个 Foo.d.ts 文件才能满足您的需求

// Foo.d.ts
declare class FooBase<T> {
  something(): any;
  bar(): any;
}

declare class FooExtra<T> extends FooBase<T> {
  foo(): any;
}

interface FooContructor {
  new <T = string>(): T extends number ? FooBase<T> : FooExtra<T>;
}

export var Foo: FooContructor;

然后就可以正常调用了

import { Foo } from './Foo';

let foo = new Foo<number>();
foo.foo(); // 报错

let foo = new Foo<string>();
foo.foo(); // OK

如果各位大佬有更简单的方案,请务必反驳我,因为我也在不断探索

class Foo<T> {
  foo = (() => {
    
  }) as T extends number ? () => void : never
}

这样?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进