如何使用属性的类型作为声明的类型?

时间:2019-08-29 05:41:04

标签: typescript

给出以下简化代码:

class Finder {
  has(prop: string, value){
    return this[prop].indexOf(value) >= 0;
  }
}

type Str = string;
type Num = number;

class A extends Finder {
  string: Str[];
  constructor(...chars){
    super();
    this.string = chars;
  }
}

class B extends Finder {
  numbers: Num[];
  constructor(...ints){
    super();
    this.numbers = ints;
  }
}

const a = new A('a', 'b', 'c');
a.has('string', 'a'); // ok

const b = new B(1, 2, 3);
b.has('numbers', '1');  // should compile error

.has方法中,如何将value的类型声明为动态的this[prop]的类型?

我可以将其声明为Str | Num,但是预计类Finder将由许多其他类似于AB的类扩展,每个类具有不同的自定义类型。所以实际上,我无法做到这一点。

1 个答案:

答案 0 :(得分:1)

使用模板:

class Finder<T> {
    has(prop: string, value: T) {
        return this[prop].indexOf(value) >= 0;
    }
}

class A extends Finder<string> {
    string: string[];

    constructor(...chars: string[]) {
        super();

        this.string = chars;
    }
}

class B extends Finder<number> {
    numbers: number[];

    constructor(...ints: number[]) {
        super();

        this.numbers = ints;
    }
}