Vyhledávání na webu

typescript - Proč moje metoda třídy nedokáže získat typy parametrů ze svého rozhraní?


Napsal jsem níže tento kód, abych ukázal svůj problém

type MyFunction<T> = (req: string, res: number) => T;

interface ITest {
  store: MyFunction<void>;
}

class Test implements ITest {
  store(req, res) { //req, res got implicit any type
      req.codePointAt()
      res.toFixed()
  }
}

Proč, když implementuji své rozhraní ITest na své třídě Test, stále není možné odvodit typy parametrů?

Odpověď č. 1

Rozhraní ITest.store musí implementovat (req: string, res: number) => void;. Metoda store ve vašem testu to technicky splňuje. Její signatura je (req: any, res: any) => void. Typy any postačují pro string i number.

Když použijete implements, váš objekt/třída/etc. souhlasí s plněním požadavků rozhraní. To znamená, že rozhraní nedělá žádná rozhodnutí o typech. Je to odpovědnost implementátora. Takže zpět k výše uvedenému, Test souhlasí s implementací rozhraní ITest. Jeho metoda store má v současnosti signaturu (req: any, res: any) => void. Protože any splňuje string a number, efektivně splňuje rozhraní ITest.

Odpověď č. 2

store není funkce, je to vlastnost, která má typ, jež je funkcí.

Pokud chcete zachovat typ, měli byste jej deklarovat takto:

    class Test implements ITest {
      store: MyFunction<void> = (req, res) => {
          req.codePointAt();
          res.toFixed();
      }
    }

A teď codePointAt chce parametr :)