Typescript: يعطي typeof this.xxx خطأ "المعرف المتوقع".

تم إنشاؤها على ٢٤ ديسمبر ٢٠١٤  ·  19تعليقات  ·  مصدر: microsoft/TypeScript

image

هل هذا عن طريق التصميم أم خطأ؟

Suggestion help wanted

التعليق الأكثر فائدة

@ sam-s4s الآن يجب أن تكون قادرًا على كتابة CMultiDataset<this["thing"]> ، بدلاً من ذلك. الوصول المفهرس _do_ يعمل مع this (واحد متعدد الأشكال ، حتى) ، على عكس typeof .

لقد حاولت للتو ، لكنها لا تعمل في TypeScript 3.4.4 رغم ذلك ، يعمل @ sam-s4s ( ClassName['thing'] ). أعتقد أنه قد يكون من المنطقي أن يعمل this ، بدلاً من القدرة على استخدام "ClassName" فقط؟

ال 19 كومينتر

أود أن أقول أيًا منهما ... إنه مجرد بناء جملة خاطئ ... جرب "var copy = typeof (this.data = {})؛" ... بعد أن قلت هذا ، لن أستخدم هذا الرمز ... إنه محير .. .

giancarloa هممم ، لا يجب إضافة هذه الأقواس. الكود أعلاه هو مجرد حد أدنى لمشغل المشكلة ، وليس رمزًا في الإنتاج ، فقد تكون هناك بعض المواقف التي قد ترغب في استخدام رمز مثل هذا.

هنا إذا أخذت this لأي شيء آخر غير ذلك ، فسيكون ذلك جيدًا ولن يتم الإبلاغ عن أي خطأ. على سبيل المثال

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

حسب المواصفات

_TypeQueryExpression: _
_ معرف_
_TypeQueryExpression_ . _IdentifierName_

لذلك هذا متوقع.

أعتقد أن سبب عدم السماح هو أن شيئًا كهذا

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

صالح تمامًا ، لأن this أكثر أو أقل من النوع any . لذا في حين أنه قد يكون منطقيًا في الفصل ، إلا أنه لا معنى له في أي سياق آخر ما لم يكن لدينا # 229.

DanielRosenwasser OO hmm ... ثم آمل أن تفكر في تحديث المواصفات. هههه.

إنه شيء يجب مراعاته ؛ إذا لم يكن أعضاؤك خاصين ، فيمكنك التغلب على هذا بسهولة من خلال ما يلي في الوقت الحالي.

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

في انتظار هذه الميزة.
أعتقد أنه ينبغي دعم أبسط حالة
var a: typeof this.x = 1 ؛

ويجب أن يؤدي نوع العضو التكراري إلى الخطأ.

شكر.

يبدو أن هذا يجب أن يعمل فقط إذا قمنا بتغيير القواعد.

RyanCavanaugh ، ولكن هل من المناسب السماح بذلك في السياق الذي قدمته؟ سيؤدي حتمًا إلى قيام الأشخاص بذلك والحصول على any كنوعهم.

صحيح نحويًا لا يعني بالضرورة أنه يجب أن يكون منطقيًا ، IMO.
يمكن رفع تحذير لهذا السبب ، رغم ذلك.

لقد سمحنا لك بالفعل بكتابة typeof foo.bar حيث يكون foo من النوع any ، ونسمح لك بالفعل بكتابة this.x في مواضع أخرى ذات تعبير نقطي عندما يكون نوع this هو any . لا أفهم لماذا تقاطعهم عند typeof this.x يستحق استثناء.

فقط لإضافة حالة استخدام أخرى. منذ بعض الوقت ، قمت بعمل تعريفات لأنواع لوداش وبعض التواقيع المدعومة هي في الحقيقة أسماء مستعارة لطرق أخرى. لقد أعلنتهم على هذا النحو:

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

هذا يعمل بشكل جيد مع الإصدار 1.0 من المترجم. لكنها لم تعد تتراكم. ولا أرى أي خيار آخر بخلاف تكرار مجموعة التوقيعات الكاملة لكل اسم مستعار لأنني لا أستطيع التفكير في TypeQueryExpression التي تعبر عن هذا.

@ juanevp ماذا عن واجهة الوظيفة؟

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

وافق. يجب أن يكون الإصلاح سهل للغاية؟ تأكد من أن هذا لا يتسبب في انبعاث _this = this في وظائف الأسهم

هل هذا مرتبط؟ أحصل على [ts] Identifier expected. مع ما يلي:


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

سيكون من المفيد أن تكون قادرًا على استخدام this.state في الحالة أعلاه.

حسنًا ، لقد واجهت هذه المشكلة للتو :(

أنا أقوم بتعريف كائن في صفي.
ثم أقوم بتعريف كائن آخر له معلمة نوع يجب أن تكون من النوع السابق.

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

في هذه الحالة ، ليس من المناسب تغيير الشيء إلى متغير ثابت والقول typeof ClassName.thing لأنه سيكون مختلفًا في كل حالة. أيضًا multi يجب أن يكون متغير فئة ، وبالتالي يجب أن يكون له نوعه في وقت إعلان الفصل.

RyanCavanaughDanielRosenwassermhegazy يبدو هذا وكان يعتقد أن يكون حل سهل نسبيا؟ يبدو أنه ابتعد عن الاهتمام على مر السنين ... هل هناك فرصة لتطبيقه؟

@ sam-s4s الآن يجب أن تكون قادرًا على كتابة CMultiDataset<this["thing"]> ، بدلاً من ذلك. الوصول المفهرس _do_ يعمل مع this (واحد متعدد الأشكال ، حتى) ، على عكس typeof .

شكرًا weswigham - CMultiDataset<ClassName['thing']> وهو ما يخرجني في الغالب من المشاكل :)

لم أتمكن من العثور على أي مجموعة باستخدام this والتي ستعمل رغم ذلك ...

@ sam-s4s الآن يجب أن تكون قادرًا على كتابة CMultiDataset<this["thing"]> ، بدلاً من ذلك. الوصول المفهرس _do_ يعمل مع this (واحد متعدد الأشكال ، حتى) ، على عكس typeof .

لقد حاولت للتو ، لكنها لا تعمل في TypeScript 3.4.4 رغم ذلك ، يعمل @ sam-s4s ( ClassName['thing'] ). أعتقد أنه قد يكون من المنطقي أن يعمل this ، بدلاً من القدرة على استخدام "ClassName" فقط؟

إذا كان لدي شيء مثل
تحميل
public groupByTypes = ['None'، 'Foo'، 'Bar'] كـ const؛

public groupBy: typeof groupByTypes [العدد] ؛
ثابت `` What is the proposed workaround? And I cannot make groupByTypes`

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات