Typescript: typeof this.xxx gibt den Fehler "Bezeichner erwartet" aus.

Erstellt am 24. Dez. 2014  ·  19Kommentare  ·  Quelle: microsoft/TypeScript

image

Ist das beabsichtigt oder ein Fehler?

Suggestion help wanted

Hilfreichster Kommentar

@ sam-s4s heutzutage solltest du stattdessen CMultiDataset<this["thing"]> schreiben können. Indizierte Zugriffe funktionieren nicht mit this (sogar einem polymorphen), im Gegensatz zu typeof .

Ich habe es gerade versucht, aber es funktioniert nicht in TypeScript 3.4.4, @ sam-s4s funktioniert ( ClassName['thing'] ). Ich denke, es könnte sinnvoller sein, dass this funktionieren sollte, anstatt nur den "Klassennamen" verwenden zu können?

Alle 19 Kommentare

Ich würde auch nicht sagen ... es ist nur eine falsche Syntax ... versuche "var copy = typeof (this.data = {});" ... nachdem ich das gesagt habe, würde ich diesen Code nicht verwenden ... es ist verwirrend ... .

@giancarloa hmm, du solltest diese Klammern nicht hinzufügen. Der obige Code ist nur ein minimaler Auslöser für Probleme, kein Code in der Produktion. In einigen Situationen möchten Sie möglicherweise Code wie diesen verwenden.

Wenn Sie this zu etwas anderem nehmen, ist dies in Ordnung und es wird kein Fehler gemeldet. z.B

class Test {
    static data = {};
    constructor() {
        var copy: typeof Test.data = {};
    }
}

Gemäß Spezifikation

_TypeQueryExpression: _
_Identifier_
_TypeQueryExpression_ . _IdentifierName_

Das wird also erwartet.

Ich denke, der Grund, warum es nicht erlaubt ist, ist so etwas

function foo() {
    var x: typeof this.x;
}

ist vollkommen gültig, da this mehr oder weniger den Typ any . Während es in einer Klasse vielleicht Sinn macht, macht es in keinem anderen Kontext Sinn, es sei denn, wir hatten # 229.

@ DanielRosenwasser OO hmm ... dann hoffe ich, dass Sie überlegen würden, die Spezifikation zu aktualisieren. lol.

Es ist etwas zu beachten; Wenn Ihre Mitglieder nicht privat sind, können Sie dies in der Zwischenzeit mit den folgenden Schritten leicht umgehen.

self = this;
var x: typeof self.data;

Warten auf diese Funktion.
Ich denke, der einfachste Fall sollte unterstützt werden
var a: typeof this.x = 1;

Und ein rekursiver Elementtyp sollte zu Fehlern führen.

Vielen Dank.

Scheint so, als ob dies nur funktionieren sollte, wenn wir die Grammatik geändert haben.

@ RyanCavanaugh , aber ist es angemessen, es in dem von mir angegebenen Kontext zuzulassen? Es wird unweigerlich dazu führen, dass Leute dies tun und any als ihren Typ bekommen.

syntaktisch korrekt muss nicht bedeuten, dass es tatsächlich Sinn machen sollte, IMO.
Aus diesem Grund könnte jedoch eine Warnung ausgegeben werden.

Wir lassen Sie bereits typeof foo.bar schreiben, wobei foo vom Typ any , und wir lassen Sie bereits this.x in andere Positionen mit gepunkteten Ausdrücken schreiben, wenn der Typ von this ist any . Ich verstehe nicht, warum ihre Kreuzung bei typeof this.x eine Ausnahme verdienen sollte.

Nur um einen weiteren Anwendungsfall hinzuzufügen. Vor einiger Zeit habe ich die Typdefinitionen für lodash erstellt und einige der unterstützten Signaturen sind wirklich Aliase für andere Methoden. Ich hatte sie so erklärt:

interface LoDashArrayWrapper<T> {
    rest(): LoDashArrayWrapper<T>;
    rest(
        callback: ListIterator<T, boolean>,
        thisArg?: any): LoDashArrayWrapper<T>;
    rest(n: number): LoDashArrayWrapper<T>;
    rest(pluckValue: string): LoDashArrayWrapper<T>;
    rest(whereValue: {}): LoDashArrayWrapper<T>;

    drop: typeof rest;

    tail: typeof rest;
}

Dies funktionierte gut mit Version 1.0 des Compilers. Aber es wird nicht mehr kompiliert. Und ich sehe keine andere Option als das Duplizieren des gesamten Signaturensatzes für jeden Alias, da mir kein TypeQueryExpression einfällt, der dies ausdrückt.

@juanevp Wie wäre es mit Funktionsschnittstelle?

interface LoDashArrayWrapper<T> {
    rest: LoDashArrayWrapperOperation<T>;
    drop: LoDashArrayWrapperOperation<T>;
    tail: LoDashArrayWrapperOperation<T>;
}

interface LoDashArrayWrapperOperation<T> {
    (): LoDashArrayWrapper<T>;
    (
        callback: ListIterator<T, boolean>,
        thisArg?: any): LoDashArrayWrapper<T>;
    (n: number): LoDashArrayWrapper<T>;
    (pluckValue: string): LoDashArrayWrapper<T>;
    (whereValue: {}): LoDashArrayWrapper<T>;
}

Genehmigt. Sollte extrem einfach zu beheben sein? Stellen Sie jedoch sicher, dass dies nicht dazu führt, dass _this = this in Pfeilfunktionen ausgegeben wird

Ist das verwandt? Ich bekomme [ts] Identifier expected. mit folgendem:


class UserState {
    <strong i="7">@observable</strong> state = {
        name : "",
        id : "",
    };

    <strong i="8">@action</strong>
    changeUser(user: typeof this.state) { // Error is here
        Object.assign(this.state, user);
    }
}

export const userState = new UserState();

Es wäre nützlich, in dem obigen Fall this.state zu können.

Hmmm, ich bin gerade auf dieses Problem gestoßen :(

Ich definiere ein Objekt in meiner Klasse.
Dann definiere ich ein anderes Objekt, das einen Typparameter hat, der der Typ des oben genannten sein muss.

thing = {
    a: 1,
    b: 2
};
multi: CMultiDataset<typeof this.thing>;

In diesem Fall ist es nicht angebracht, nur eine statische Variable zu ändern und typeof ClassName.thing sagen, da dies in jedem Fall anders ist. Außerdem muss multi eine Klassenvariable sein und daher ihren Typ in der Klassendeklarationszeit haben.

@RyanCavanaugh @DanielRosenwasser @mhegazy klingt so, als wäre dies eine relativ einfache Lösung? Sieht so aus, als wäre es im Laufe der Jahre der Aufmerksamkeit entgangen ... Gibt es eine Chance, dass es umgesetzt wird?

@ sam-s4s heutzutage solltest du stattdessen CMultiDataset<this["thing"]> schreiben können. Indizierte Zugriffe funktionieren nicht mit this (sogar einem polymorphen), im Gegensatz zu typeof .

Danke @weswigham - Ich habe herausgefunden, dass ich CMultiDataset<ClassName['thing']> was mich meistens aus Schwierigkeiten herausholt :)

Ich konnte mit this keine Kombination finden, die funktionieren würde ...

@ sam-s4s heutzutage solltest du stattdessen CMultiDataset<this["thing"]> schreiben können. Indizierte Zugriffe funktionieren nicht mit this (sogar einem polymorphen), im Gegensatz zu typeof .

Ich habe es gerade versucht, aber es funktioniert nicht in TypeScript 3.4.4, @ sam-s4s funktioniert ( ClassName['thing'] ). Ich denke, es könnte sinnvoller sein, dass this funktionieren sollte, anstatt nur den "Klassennamen" verwenden zu können?

Wenn ich so etwas habe
`` `Typoskript
public groupByTypes = ['Keine', 'Foo', 'Bar'] als const;

public groupBy: typeof groupByTypes [number];
`` What is the proposed workaround? And I cannot make groupByTypes` statisch

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen