Reactjs - تايبسكريبت و React: فشل استنتاج النوع عند استخدام React.Component و props ذات النوع الشرطي


في الإعداد أدناه، أحاول الحصول على النوع الصحيح المستنتج لمعلمة القيمة في دالة onChange. الإعداد أدناه يعطيني قيمة من النوع string | number رغم أنني كنت أظن أنه يجب أن يكون string نظرًا لأن القيمة تم تعيينها على string.

import * as React from 'react'

type NumberProps = {
    decimals: number;
};

type StringProps = {};

type Props<T> = {
    value: T;
    onChange: (value: T) => void;
} & (T extends number ? NumberProps : StringProps);

class Y<T extends string | number> extends React.Component<Props<T>> {}

new Y({ value: 2.5, onChange:((value) => { /* value is inferred as string | number, but should be number */ })})

شيئان سيجعلان الاستنتاج صحيحًا - ولكنه بالطبع سيكون غير صحيح بطرق أخرى - ولكنه قد يعطي فكرة عما هو خطأ:

  1. يمكنني إزالة هذا الجزء من نوع Props: & (T extends number ? NumberProps : StringProps);

  2. يمكنني جعل Y يرث من شيء آخر غير React.Component، على سبيل المثال فصل مثل class X<T> { constructor(props: T) {} }.

هل أفعل/أتوقع شيئًا خاطئًا، أم أن هذه مشكلة في تايب سكريبت و/أو أنواع React؟

الإجابة رقم 1

إذا لم تنجح استنتاج النوع، يمكنك تحديد قيمة معامل النوع بنفسك صراحة:

new Y<string>({ value: 'test', onChange:((value) => { /* value is now a string */ })})