javascript - ESLint beschwert sich, dass die TypeScript-Typdeklaration einen Typ verwendet, bevor er deklariert wurde
Ich erstelle einen Builder, der Typen hat, die Art, wie ich den Typ deklariere, ist:
export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}
Beim Ausführen von ESLint wird bemängelt, dass: "BuilderInteface" wurde verwendet, bevor es definiert wurde (no-use-before-define). Das ist normal, da ich sicherstellen muss, dass jede Argumentfunktion einen Builder derselben Art zurückgibt.
Welche Möglichkeiten habe ich, dies zu deklarieren, ohne die eslint-Regel zu brechen? Sollte ich die Regel direkt ignorieren? Warum?
Antwort #1
ESLint hat (sozusagen) recht, weil du technisch gesehen den Typ nicht deklariert hast und ihn trotzdem verwendest. Rekursive Typen sind ziemlich schwer zu handhaben. Versuche, TSLint zu verwenden, um zu sehen, ob du ein besseres Ergebnis erzielst, da es TypeScript besser versteht.
Das TypeScript-Team ist ziemlich gut in rekursiven Typen, also ist es ein gültiger Typ.
Deaktivieren Sie die Regel oder erstellen Sie eine Ausnahme, damit die Werkzeuge es Ihnen ermöglichen, Ihre Arbeit fortzusetzen!
Antwort #2
Das liegt daran, dass Typen im Gegensatz zu Schnittstellen nicht selbstreferenzierbar sind. Du solltest entweder deinen Typ zerlegen, um Selbstreferenzierung zu vermeiden, oder Schnittstellen verwenden.
P.S. Das Obige ist theoretisch... Aus irgendeinem Grund funktioniert dein Typ jedoch für mich (kein tslint, nur ts). Ich schätze, neue Versionen von TS gehen damit gut um. Schau dir das an: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
P.P.S. Ich habe gerade bemerkt, dass du über JSLint gesprochen hast, nicht über TSLint. JSLint ist natürlich kein gutes Werkzeug, um TS-Code zu überprüfen. Versuche stattdessen TSLint.