reactjs 如何让TypeScript引擎允许在JSX中自定义HTML属性?

e37o9pze  于 2023-04-29  发布在  React
关注(0)|答案(3)|浏览(174)

我假设Visual Studio Code中的TypeScript引擎已经收到了一个更新,现在第一次抱怨我在HTML元素上预先存在的自定义 prop 无效。这是一个Babel/React/JSX项目,没有任何TypeScript。

<div custom="bar" />
  • 注意:它们(技术上)是无效的,但我消耗它们,所以我知道我在做什么(这是故意的)。*

See it on CodePen!

参见

x9ybnkn6

x9ybnkn61#

React类型定义文件(默认情况下为create-react-app)包含所有标准HTML元素以及已知属性的列表。
为了允许自定义HTML属性,你需要定义它的类型。通过扩展HTMLAttributes接口来实现:

import { HTMLAttributes } from "react";

declare module 'react' {
  interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
    // extends React's HTMLAttributes
    custom?: string;
  }
}

阅读更多关于TypeScript文档上的模块增强。

dldeef67

dldeef672#

注意:如果一个属性名不是一个有效的JS标识符(比如data-* 属性),如果在元素attributes类型中找不到它,它不会被认为是一个错误。
<div data-custom="bar" />
www.example. com https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*

00jrzges

00jrzges3#

项目结构:

☁  extends-react-types  tree -I 'node_modules' 
.
├── App.tsx
├── index.d.ts
├── package-lock.json
├── package.json
└── tsconfig.json

0 directories, 5 files

软件包版本:

{
  "name": "extends-react-types",
  "devDependencies": {
    "@types/react": "^16.9.56",
    "typescript": "^4.3.5"
  },
  "dependencies": {
    "react": "^16.8.6"
  }
}

tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "lib": [
            "dom"
        ],
        "allowSyntheticDefaultImports": true,
        "moduleResolution": "Node",
        "jsx": "preserve",
    }
}

App.tsx

import React from 'react';

interface HomeProps extends React.ComponentPropsWithRef<'div'> {}
export default function Home(props: HomeProps) {
  return (
    <div>
      <p _name="name" _error={true}>
        123
      </p>
    </div>
  );
}

正如您所看到的,p元素中有两个自定义HTML属性:_name_error。现在,我们需要使用这两个自定义HTML属性扩展ReactHTMLAttributes接口。

选项一:

index.d.ts

import 'react';

declare module 'react' {
  interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
    _name?: string;
    _error?: boolean;
  }
}

输出:

选项二:

declare namespace React {
  interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
    _name?: string;
    _error?: boolean;
  }
}

输出:

相关问题