簡體   English   中英

Typescript:防止 React 道具 object 的額外鍵?

[英]Typescript: prevent extra keys for a React prop object?

使用 object arguments 調用函數時,禁止使用額外的鍵:

function foo({ key }) {}

foo({ key: 1, key2: 2 });

Argument of type '{ key: number; key2: number; }' is not assignable to parameter of type '{ key: any; }'.
  Object literal may only specify known properties, and 'key2' does not exist in type '{ key: any; }'

但是,對於 React 功能組件,此錯誤不會觸發:

function Foo({
  obj: { key },
}) {}

<Foo obj={{ key: 1, key2: 2 }} />

有沒有辦法讓它成為一個錯誤?

嘗試將 Foo 用作示例中的組件時,出現錯誤'Foo' cannot be used as a JSX component. Its return type 'void' is not a valid JSX element.ts(2786) 'Foo' cannot be used as a JSX component. Its return type 'void' is not a valid JSX element.ts(2786)

像這樣修改 Foo 以返回 JSX

function Foo({ obj: { key } }) {
  return <div>{key}</div>;
}

function 會拋出您想要的錯誤。

當您嘗試這樣做時,TypeScript應該會產生錯誤。 類型推斷非常好。 也許你的 eslint 配置有問題? 如果您運行 TypeScript 編譯器(不僅僅是 eslint),它會產生任何錯誤嗎?

無論哪種方式,鍵入函數/React 組件道具的更好方法是更明確,如下所示:

function Foo({
  obj: { key },
}: {
  obj: {
    key: number;
  }
}) {
  // etc.
}

或者,對於某些人的口味來說更容易消化:

type FooProps = {
  obj: {
    key: number;
  }
}

function Foo({obj: {key}}: FooProps) {
  // etc
}

基本模式是function MyComponent(props: MyPropsType) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM