给出以下简化代码:
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
将由许多其他类似于A
和B
的类扩展,每个类具有不同的自定义类型。所以实际上,我无法做到这一点。
答案 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;
}
}