Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.8k views
in Technique[技术] by (71.8m points)

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上面。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

假设这个文件是 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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...