• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Typescript] Brak typu constructor

Object Storage Arubacloud
0 głosów
133 wizyt
pytanie zadane 14 grudnia 2019 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)

Witajcie, ostatnimi czasy piszę bota do komend, który ma być podpięty do bazy danych przez type-orm, więc tak piszę w typescript. Mam następujący kod

To jest mój interfejs:

export default interface iCommand {
  args: Array<String>;
  message: any;
  client: any;
  config: any;
  new(args: String[], message: any): void;
  runCommand(): void;
  test(): void;
  setClient(client: any): void;
  setConfig(config: any): void;
}

To jest moja klasa implementująca interfejs.

Cały czas twierdzi, że coś żle implementuje interfejs:

import iCommand from './i-command';

export default class Voice implements iCommand {
  args: String[];    
  message: any;
  client: any;
  config: any;

  constructor(args: String[], message: any) {
    this.args = args;
    this.message = message;
    this.client = {};
    this.config = {};
  }

  test() {
    console.log('run');
  }

  setClient(client: any) {
    this.client = client;
  }

  setConfig(config: any) {
    this.config = config;
  }

  runCommand(): void {
    this.message.channel.send('Ping');
    this.client.channels.get(this.config.infoChannelId).send('Pong');
  }
}

Błąd jest taki:

Class 'Voice' incorrectly implements interface 'iCommand'.

Type 'Voice' provides no match for the signature 'new (args: String[], message: any): void'.ts(2420)\

Slownik komend:

import Voice from './voice';

export const Commands = {
  'voice': Voice
}

A to jest manager, który zwraca przez nas pożądaną komendę


import {Commands} from './commands/commands';
import iCommand from './commands/i-command';

export default class CommandManager {
  client: any;
  config: any;

  constructor(config: any) {
    this.config = config;
    this.client = {};
  }

  setClient(client: any) {
    this.client = client;
  }
  
  getCommand(key, args, message): iCommand {
    let command: iCommand = new Commands[key](args, message);
    command.test();
    command.setConfig(this.config);
    command.setClient(this.client);
    return command;
  }
}

I dostaje taki blad:

commands_1.Commands[key] is not a constructor

oczywiście kod się wykonuje ale w oczy gryzie. Pracuje na windzie. Ktoś wie dlaczego to nie dziala?

 

komentarz 15 grudnia 2019 przez Ehlert Ekspert (212,670 p.)

Nie używaj typu any.

1 odpowiedź

0 głosów
odpowiedź 15 grudnia 2019 przez rafal.budzis Szeryf (85,260 p.)
new(args: String[], message: any): void;

tu podajesz że chcesz stworzyć funkcje o nawie new a oczekujesz że sprawdzi Ci nazwe constructor. Zrób

constructor(args: String[], message: any): void;

 

Co do drugiego problemu to masz https://forum.pasja-informatyki.pl/420195/typescript-jak-zapisac-typ-klasy

 

Plus w funkcji getCommand(key, args, message) key musi miec okreslone wartości więc powinieneś stowrzyć taki typ który je sprawdzi:

getCommand(key: (typeof keyof Commands), args, message)

 

komentarz 15 grudnia 2019 przez ShiroUmizake Nałogowiec (46,300 p.)
Gdy zmieniłem mu na constructor zaczął krzyczeć, że żle interpretuje interfejs, a jak klikałem quickfix, robił to samo.

W dokumentacji jest new, ale owszem to nie działa.

Spojrzałem na tamto i dalej nie wiem jak to rozwiązać.

Podobne pytania

+1 głos
0 odpowiedzi 162 wizyt
+3 głosów
0 odpowiedzi 276 wizyt
+1 głos
1 odpowiedź 162 wizyt
pytanie zadane 15 maja 2022 w JavaScript przez Bakkit Dyskutant (7,600 p.)

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...