إصدار 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
وأحصل على نفس الخطأ.
رابط الملعب:
القضايا ذات الصلة:
أعتقد أن الخطأ صحيح هنا. نعم ، يمكن 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 }))
التعليق الأكثر فائدة
أعتقد أن الخطأ صحيح هنا. نعم ، يمكن
R1 & R2
للإعداد الافتراضيR
، ولكن قد يتم إنشاء مثيلR
بنوع محدد _more_. خذ بعين الاعتبار إنشاء مثيل التالي.هذا إنشاء مثيل صالح لـ
R1
،R2
، وR
، لكنR1 & R2
_ غير قابل للتخصيص لـR
لأنه يفتقد المعلمةz
.في المثال الخاص بك ، المعلمة
R
ليست مطلوبة بالفعل (على الرغم من أن حالة الاستخدام الحقيقية قد تكون أكثر تعقيدًا). هذا يعمل: