能否根據 PropTypes 推斷 TypeScript 中的類型?
P粉715304239
2023-08-14 17:59:21
<p>我知道如何在這種情況下推斷類型:</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; // number | null | undefined</pre>
<p>然而,在我的情況下,我有:</p>
<pre class="brush:php;toolbar:false;">const propsShape = PropTypes.shape({
id: PropTypes.number,
// 更多包含巢狀的 PropTypes.shape 呼叫的屬性
});</pre>
<p>如果我嘗試:</p>
<pre class="brush:php;toolbar:false;">type PropsFromShape = PropTypes.InferProps<typeof propsShape>;
const y: PropsFromShape = {};
const z = y.id;</pre>
<p>它無法編譯:</p>
<pre class="brush:php;toolbar:false;">Type '{}' is not assignable to type 'PropsFromShape'.
Property 'isRequired' is missing in type '{}' but required in type 'InferPropsInner<Pick<Requireable<InferProps<{ id: Requireable<number>; }>>, "isRequired"><number>; }>>, "isReRe.
Property 'id' does not exist on type 'PropsFromShape'.</pre>
<p>我可以將<code>shape</code> 的參數提取為單獨的常數,並按上述方式操作,但是否有一種從<code>propsShape</code> 直接推斷屬性類型的好方法? </p>
要取得嵌套物件的類型,您可以使用
#type NestedProps = PropTypes.InferProps<typeof propsShape>['isRequired'];
或者,如果您可以將整個props定義放在一個地方:
我個人認為後者比較易讀。