Там нет, чтобы сделать это из коробки. Абстрактный класс - это самое близкое к тому, что вы хотите, но он действительно не позволит вам проверить, имеет ли тип конкретный конструктор.
Один из способов сделать это - добавить в класс дополнительный параметр типа. Это может быть ограничено typeof HDWallet
, который будет представлять подпись конструктора базового класса. Производные классы должны передать себя в качестве этого дополнительного параметра, и затем их сигнатура конструктора будет проверена на совместимость с сигнатурой базового класса:
abstract class HDWallet<T extends typeof HDWallet> {
/**
* Return BIP39 12 words new random mnemonic seed phrase
*/
static generateMnemonic(): string {
return "";
}
constructor(bip39SeedPhrase: string, password?: string, testnet?: boolean) { }
abstract getAddress(addressIndex?: number) : string;
abstract async getBalance(address? : string) : Promise<number>;
}
class BitcoinHDWallet extends HDWallet<typeof BitcoinHDWallet> {
getAddress(addressIndex?: number) : string { return ""}
async getBalance(address?: string): Promise<number> { return Promise.resolve(0);}
}
class EthereumHDWallet extends HDWallet<typeof EthereumHDWallet> { /// error
constructor(testnet?: boolean) {
super("", "", false)
}
getAddress(addressIndex?: number) : string { return ""}
async getBalance(address?: string): Promise<number> { return Promise.resolve(0);}
}
Обратите внимание, что используя интерфейсы, вы можете описать статическую часть класса, а также тип экземпляра, в зависимости от того, что вы пытаетесь проверить:
interface HDWalletClass {
generateMnemonic(): string
new (bip39SeedPhrase: string, password?: string, testnet?: boolean): {
getAddress(addressIndex?: number): string;
getBalance(address?: string): Promise<number>;
}
}
abstract class HDWallet {
/**
* Return BIP39 12 words new random mnemonic seed phrase
*/
static generateMnemonic(): string {
return "";
}
constructor(bip39SeedPhrase: string, password?: string, testnet?: boolean) { }
abstract getAddress(addressIndex?: number) : string;
abstract async getBalance(address? : string) : Promise<number>;
}
class BitcoinHDWallet extends HDWallet {
getAddress(addressIndex?: number) : string { return ""}
async getBalance(address?: string): Promise<number> { return Promise.resolve(0);}
}
class EthereumHDWallet extends HDWallet { /// error
constructor(testnet?: boolean) {
super("", "", false)
}
getAddress(addressIndex?: number) : string { return ""}
async getBalance(address?: string): Promise<number> { return Promise.resolve(0);}
}
let a: HDWalletClass = BitcoinHDWallet; //ok
let b: HDWalletClass = EthereumHDWallet; // err