Typescript: typeof this.xxx memberikan kesalahan "pengenal diharapkan".

Dibuat pada 24 Des 2014  ·  19Komentar  ·  Sumber: microsoft/TypeScript

image

Apakah ini disengaja atau bug?

Suggestion help wanted

Komentar yang paling membantu

@ sam-s4s saat ini Anda seharusnya bisa menulis CMultiDataset<this["thing"]> , sebagai gantinya. Akses terindeks _do_ berfungsi dengan this (bahkan polimorfik), tidak seperti typeof .

Saya baru saja mencoba, tetapi tidak berhasil di TypeScript 3.4.4, @ sam-s4s yang berfungsi ( ClassName['thing'] ). Saya pikir mungkin lebih masuk akal bahwa this harus berfungsi, daripada hanya dapat menggunakan "NamaKelas"?

Semua 19 komentar

saya tidak akan mengatakan keduanya ... itu hanya sintaks yang salah ... coba "var copy = typeof (this.data = {});" ... setelah mengatakan ini, saya tidak akan menggunakan kode ini ... itu membingungkan .. .

@giancarloa hmm, Anda tidak boleh menambahkan tanda kurung itu. kode di atas hanyalah pemicu masalah minimum, bukan kode dalam produksi, akan ada beberapa situasi di mana Anda mungkin ingin menggunakan kode seperti ini.

di sini jika Anda mengambil this untuk hal lain selain itu, itu akan baik-baik saja dan tidak ada kesalahan yang akan dilaporkan. misalnya

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

Sesuai spesifikasi

_TypeQueryExpression: _
_Identifier_
_TypeQueryExpression_ . _IdentifierName_

Jadi ini yang diharapkan.

Saya pikir alasan itu tidak diperbolehkan adalah sesuatu seperti ini

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

valid sempurna, karena this kurang lebih memiliki tipe any . Jadi, meskipun mungkin masuk akal di kelas, itu tidak masuk akal dalam konteks lain kecuali kita memiliki # 229.

@DanielRosenwasser OO hmm ... semoga Anda mempertimbangkan untuk memperbarui spesifikasi. lol.

Itu sesuatu yang perlu dipertimbangkan; jika anggota Anda tidak bersifat pribadi, Anda dapat dengan mudah menyiasatinya dengan yang berikut ini sementara waktu.

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

Menunggu fitur ini.
Saya pikir kasus yang paling sederhana harus didukung
var a: typeof this.x = 1;

Dan tipe anggota rekursif harus menyebabkan kesalahan.

Terima kasih.

Sepertinya ini hanya berfungsi jika kita mengubah tata bahasa.

@RyanCavanaugh , tetapi apakah pantas untuk mengizinkannya dalam konteks yang saya berikan? Ini pasti akan menyebabkan orang melakukannya dan mendapatkan any sebagai tipenya.

benar secara sintaksis tidak harus berarti bahwa itu benar-benar masuk akal, IMO.
peringatan bisa dimunculkan untuk tujuan ini.

Kami telah mengizinkan Anda menulis typeof foo.bar mana foo adalah tipe any , dan kami telah mengizinkan Anda menulis this.x pada posisi ekspresi bertitik lainnya ketika tipe dari this adalah any . Saya tidak mengerti mengapa persimpangan mereka pada typeof this.x harus mendapat pengecualian.

Hanya untuk menambahkan kasus penggunaan lain. Beberapa waktu yang lalu saya membuat definisi tipe untuk lodash dan beberapa tanda tangan yang didukung sebenarnya adalah alias untuk metode lain. Saya telah menyatakannya seperti ini:

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;
}

Ini bekerja dengan baik dengan versi 1.0 dari kompilator. Tapi itu tidak bisa dikompilasi lagi. Dan saya tidak melihat opsi lain selain menduplikasi seluruh rangkaian tanda tangan untuk setiap alias karena saya tidak dapat memikirkan TypeQueryExpression yang mengungkapkan ini.

@juanevp Bagaimana dengan antarmuka fungsi?

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>;
}

Disetujui. Haruskah perbaikan sangat mudah? Pastikan ini tidak menyebabkan _this = this emit dalam fungsi panah

Apakah ini terkait? Saya mendapatkan [ts] Identifier expected. dengan yang berikut:


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();

Akan sangat berguna untuk dapat menggunakan this.state dalam kasus di atas.

Hmmm, saya baru saja mengalami masalah ini :(

Saya sedang mendefinisikan suatu objek di kelasku.
Kemudian saya mendefinisikan objek lain yang memiliki tipe param yang harus tipe di atas.

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

Dalam hal ini tidak tepat untuk hanya mengubah sesuatu ke variabel statis dan mengatakan typeof ClassName.thing karena akan berbeda di setiap contoh. Juga multi perlu menjadi variabel kelas, dan dengan demikian harus memiliki tipenya dalam waktu deklarasi kelas.

@RyanCavanaugh @DanielRosenwasser @mhegazy terdengar seperti ini dianggap perbaikan yang relatif mudah? Sepertinya itu terlepas dari perhatian selama bertahun-tahun ... Adakah kemungkinan itu diterapkan?

@ sam-s4s saat ini Anda seharusnya bisa menulis CMultiDataset<this["thing"]> , sebagai gantinya. Akses terindeks _do_ berfungsi dengan this (bahkan polimorfik), tidak seperti typeof .

Terima kasih @weswigham - Saya menemukan bahwa saya dapat melakukan CMultiDataset<ClassName['thing']> yang sebagian besar membuat saya keluar dari masalah :)

Saya tidak dapat menemukan kombinasi apa pun menggunakan this yang akan berhasil ...

@ sam-s4s saat ini Anda seharusnya bisa menulis CMultiDataset<this["thing"]> , sebagai gantinya. Akses terindeks _do_ berfungsi dengan this (bahkan polimorfik), tidak seperti typeof .

Saya baru saja mencoba, tetapi tidak berhasil di TypeScript 3.4.4, @ sam-s4s yang berfungsi ( ClassName['thing'] ). Saya pikir mungkin lebih masuk akal bahwa this harus berfungsi, daripada hanya dapat menggunakan "NamaKelas"?

Jika saya memiliki sesuatu seperti
`` naskah ketikan
public groupByTypes = ['None', 'Foo', 'Bar'] sebagai const;

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jbondc picture jbondc  ·  3Komentar

fwanicka picture fwanicka  ·  3Komentar

Roam-Cooper picture Roam-Cooper  ·  3Komentar

manekinekko picture manekinekko  ·  3Komentar

Antony-Jones picture Antony-Jones  ·  3Komentar