Typescript: لا يتم التعرف على تقاطع اثنين من المعلمات العامة لتكوين معلمة ثالثة على أنها مكافئة

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


إصدار TypeScript: 3.3.0-dev.201xxxxx


مصطلحات البحث:

تقاطع الأدوية

الشفرة

let connect = <R1,R2, R = R1&R2 >(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R => {
  let state = {};
  let dispatch = () => { };
  return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}

سلوك متوقع:
أتوقع أن يكون هذا صحيحًا لأنني قمت بتعريف R = R1&R2 في التوقيع العام.

السلوك الفعلي:

الحصول على خطأ Type 'R1 & R2' is not assignable to type 'R'. في بيان الإرجاع. لقد جربت أيضًا R extends R1&R2 وأحصل على نفس الخطأ.

رابط الملعب:

حلقة الوصل

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

https://github.com/Microsoft/TypeScript/issues/5823

Question

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

أعتقد أن الخطأ صحيح هنا. نعم ، يمكن R1 & R2 للإعداد الافتراضي R ، ولكن قد يتم إنشاء مثيل R بنوع محدد _more_. خذ بعين الاعتبار إنشاء مثيل التالي.

connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );

هذا إنشاء مثيل صالح لـ R1 ، R2 ، و R ، لكن R1 & R2 _ غير قابل للتخصيص لـ R لأنه يفتقد المعلمة z .

في المثال الخاص بك ، المعلمة R ليست مطلوبة بالفعل (على الرغم من أن حالة الاستخدام الحقيقية قد تكون أكثر تعقيدًا). هذا يعمل:

let connect = <R1,R2>(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R1 & R2 => {
  let state = {};
  let dispatch = () => { };
  return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}

ال 3 كومينتر

أعتقد أن الخطأ صحيح هنا. نعم ، يمكن R1 & R2 للإعداد الافتراضي R ، ولكن قد يتم إنشاء مثيل R بنوع محدد _more_. خذ بعين الاعتبار إنشاء مثيل التالي.

connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );

هذا إنشاء مثيل صالح لـ R1 ، R2 ، و R ، لكن R1 & R2 _ غير قابل للتخصيص لـ R لأنه يفتقد المعلمة z .

في المثال الخاص بك ، المعلمة R ليست مطلوبة بالفعل (على الرغم من أن حالة الاستخدام الحقيقية قد تكون أكثر تعقيدًا). هذا يعمل:

let connect = <R1,R2>(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R1 & R2 => {
  let state = {};
  let dispatch = () => { };
  return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}

حسنًا ، هذه نقطة جيدة. كان الهدف هنا هو الوصول في النهاية إلى حيث يمكنك تحديد نوع الإرجاع R والحصول على نوع الأمان الذي سينتج عنه mapState2Props & mapDispatch2Props مجتمعة في R كائن.

على سبيل المثال:

interface IComponentProps{
  foo: string;
  doFoo: ()=>void
}
let props: IComponentProps = connect<IComponentProps>(
  (state) => { foo: state.foo },
  (dispatch) => {doFoo: () => dispatch('FOO')}
)

ومع ذلك ... لست متأكدًا مما إذا كان هذا ممكنًا ... يبدو أنك ستحتاج بدلاً من ذلك إلى تعريف R1 & R2 كمجموعة فرعية من R ، لكنهما يعتمدان على بعضهما البعض ...

لاحظ أن R قد يكون أيضًا نوعًا غير مرتبط تمامًا. وسائط النوع الافتراضي في الأدوية العامة ليست قيودًا.

connect<{ a: string }, { b: number }, { c: boolean[] }>(() => ({ a: "a" }), () => ({ b: 3 }))
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات