Typescript: تعذر تعيين قيمة متوافقة لخاصية مكتوبة عامة باستخدام "يمتد" في تعريف عام.

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

إصدار TypeScript: 2.2.2

قد أكون مجرد سوء فهم لكيفية عمل الأدوية الجنيسة (إذا كان الأمر كذلك ، يرجى توجيهي إلى الاتجاه الصحيح) ، لكن هذا يبدو وكأنه خطأ.

رمز

// A *self-contained* demonstration of the problem follows...

interface BaseState {
    on: boolean;
};

class Component {
    state: BaseState;

    setState(state: BaseState) {
        this.state = state;
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // no error
    }
}

class GenericComponent<State extends BaseState> {
    state: State;

    setState(state: State) {
        this.state = state
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // error Argument of type '{ on: boolean; }' is not assignable to parameter of type 'State'.
    }
}

سلوك متوقع:
في فئة Component في المثال أعلاه ، لا تسبب أي أخطاء عند استخدام واجهة BaseState مباشرة. أتوقع نفس السلوك من فئة GenericComponent لأن الفئة العامة State تمتد صراحة إلى BaseState .

السلوك الفعلي:
بدلاً من ذلك ، تلقيت الخطأ التالي المتعلق بـ this.setState({ on: value > 0 }); : "الوسيطة من النوع '{on: boolean؛}' غير قابلة للتخصيص إلى معلمة من النوع 'State'."

Question

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

ضع في اعتبارك ما يحدث إذا كتبت هذا

var t = new GenericComponent<{on: boolean, thing: string}>();
t.onInput({ value: 30 });
t.state.thing.substr(0); // 'thing' property should exist, but doesn't

ال 3 كومينتر

ضع في اعتبارك ما يحدث إذا كتبت هذا

var t = new GenericComponent<{on: boolean, thing: string}>();
t.onInput({ value: 30 });
t.state.thing.substr(0); // 'thing' property should exist, but doesn't

هذا مثال مبسط:

class Stateful<State extends { on: boolean }> {
  state: State = {
    on: true
  }; // error
}

سبب عدم نجاح ذلك هو أنه سيكون صالحًا فقط عندما يتم إنشاء مثيل Stateful باستخدام وسيطة من النوع تعادل بالضبط { on: boolean } .

في الأساس ، _ يوجد_ نوع T ، يفي بقيود وسيطة نوع Stateful مثل أن إنشاء مثيل صالح ولكن هذا لا ينطبق _ لجميع_ الأنواع T حيث T يلبي Stateful .

لذلك يؤكد الرمز الخاطئ أعلاه ، بالنسبة لجميع الأنواع ، T<T> حيث T, Stateful".

منطقيا ، يمكننا النظر إليه على النحو التالي

تأكيد

  1. اجعل P من النوع { on: boolean }
  2. لجميع الأنواع T مثل أن T قابل للتخصيص لـ P ، تعريف Stateful<T> أعلاه صالح

النقض من خلال مثال مضاد

  1. اجعل U من النوع { on: boolean, value: number }
  2. U قابل للتخصيص لـ P -> حسب التعريف
  3. Stateful<U> غير صالح -> بالتعويض
  4. لذلك يوجد نوع T مثل أن T قابل للتخصيص إلى P و Stateful<T> هو مثيل غير صالح -> ضمنيًا

RyanCavanaughaluanhaddad تبادل لاطلاق النار، وأنا أعرف ذلك. لقد أصبت بالارتباك أثناء محاولتي اختزال المشكلة إلى شيء أبسط لذا دعونا نحاول ذلك مرة أخرى. ماذا عن استخدام الجزئي في هذه الحالة؟ ما زلت أحصل على خطأ مماثل.

interface BaseState {
    on: boolean;
};

class Component {
    state: BaseState;

    setState(partialState: Partial<BaseState>) {
        this.state = { ...this.state, ...partialState };
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // no error
    }
}

class GenericComponent<State extends BaseState> {
    state: State;

    setState(partialState: Partial<State>) {
        this.state = { ...this.state, ...partialState };
    }

    onInput({ value }: { value: number }) {
        this.setState({ on: value > 0 });  // error: Argument of type '{ on: boolean; }' is not assignable to parameter of type 'Partial<State>'
    }
}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

OliverJAsh picture OliverJAsh  ·  242تعليقات

xealot picture xealot  ·  150تعليقات

tenry92 picture tenry92  ·  146تعليقات

nitzantomer picture nitzantomer  ·  135تعليقات

blakeembrey picture blakeembrey  ·  171تعليقات