Können Typen in TypeScript aus PropTypes abgeleitet werden?
P粉715304239
2023-08-14 17:59:21
<p>Ich weiß, wie ich in diesem Fall auf den Typ schließen kann: </p>
<pre class="brush:php;toolbar:false;">import PropTypes from 'prop-types';
const props = {
id: PropTypes.number,
};
type Props = PropTypes.InferProps<typeof props>;
const x: Props = {};
x.id; // Zahl |. undefiniert</pre>
<p>In meinem Fall habe ich jedoch:</p>
<pre class="brush:php;toolbar:false;">const propsShape = PropTypes.shape({
id: PropTypes.number,
// Weitere Eigenschaften, einschließlich verschachtelter PropTypes.shape-Aufrufe
});</pre>
<p>Wenn ich es versuche: </p>
<pre class="brush:php;toolbar:false;">type PropsFromShape = PropTypes.InferProps<typeof propsShape>;
const y: PropsFromShape = {};
const z = y.id;</pre>
<p>Die Kompilierung ist fehlgeschlagen: </p>
<pre class="brush:php;toolbar:false;">Typ „{}“ kann nicht dem Typ „PropsFromShape“ zugewiesen werden.
Die Eigenschaft „isRequired“ fehlt im Typ „{}“, ist aber im Typ „InferPropsInner<Pick<Requireable<InferProps<{ id: Requireable<number>;, „isRequired“>>“ erforderlich.
Die Eigenschaft „id“ ist für den Typ „PropsFromShape“ nicht vorhanden.</pre>
<p>Ich könnte den Parameter von <code>shape</code> in eine separate Konstante extrahieren und es wie oben machen, aber gibt es eine Möglichkeit, den Eigenschaftstyp direkt von <code>propsShape</code> abzuleiten? Ein guter Weg? </p>
要获取嵌套对象的类型,您可以使用
type NestedProps = PropTypes.InferProps<typeof propsShape>['isRequired'];
或者,如果您可以将整个props定义放在一个地方:
我个人认为后者更易读。