一周bug总结(1):React+TS+ANTD

React + TypeScript + Ant Design

浏览Ant Design 并尝试使用时出现了一些bug

解决了并记录一下

package.json
    "antd": "^4.17.3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^6.1.1",
    "react-scripts": "5.0.0",
    "typescript": "^4.5.4",

1、 useState 里面定义类型

const [value,SetValue] = useState('' as string|number)
// 此时 value 的类型被定义成了 string|number

2、 索引签名不能使用

// 关键代码
const contentList = {
  tab1: <p>content1</p>,
  tab2: <p>content2</p>,
const [activeTabKey1, setActiveTabKey1] = useState('tab1');
// TSX
  <div> { contentList[activeTabKey1] } </div>
// TSX 报错
// Error :元素隐式具有 "any" 类型,因为类型为 "string" 的表达式不能用于索引类型 "{ tab1: Element; tab2: Element; }"。
  在类型 "{ tab1: Element; tab2: Element; }" 上找不到具有类型为 "string" 的参数的索引签名。

解决办法:为 activeTabKey1 添加 " 显式类型断言 "

// 类型断言
const [activeTabKey1, setActiveTabKey1] = useState('tab1' as keyof typeof contentList);

3、 动态绑定样式的时候出错

// 关键代码
const contentStyle = {
    textAlign:'center'
// TSX
  <h3 style={contentStyle}>1</h3>
// style 报错
// 不能将类型“{ height: string; color: string; lineHeight: string; textAlign: string; background: string; }”分配给类型“Properties<string | number, string & {}>”。
  属性“textAlign”的类型不兼容。
    不能将类型“string”分配给类型“TextAlign | undefined”。ts(2322)
index.d.ts(1847, 9): 所需类型来自属性 "style",在此处的 "DetailedHTMLProps<HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>" 类型上声明该属性

一看就是 textAlign 错了,将 textAlign 修改为 TextAlign 之后不报错了但是样式显示失败

解决方法:

textAlign: 'center' as 'center' 

4、 react-router-dom 中 activeclassname 不能继续使用

// 错误代码
<NavLink to="start" activeclassname="active"> leemulus </NavLink>
// 推测是新版本不能被弃用了
// 解决代码
  <NavLink className={ ({isActive})=>'defaultStyle'+ (isActive ?' activeStyle':'')} to="start"  >起步</NavLink>
// 在className 里面添加