文件模块
commonjs, amd, es modules, others
首先,我们需要澄清这些模块系统的不一致性。我将会提供给你我当前的建议,以及消除一些你的顾虑。 你可以根据不同的 module 选项来把 TypeScript 编译成不同的 JavaScript 模块类型,这有一些你可以忽略的东西:AMD:不要使用它,它仅能在浏览器工作;SystemJS:这是一个好的实验,已经被 ES 模块替代;ES 模块:它并没有准备好。
- 放弃使用 import/require 语法即 import foo = require(‘foo’) 写法
- 推荐使用 ES 模块语法
Omit 忽略一些类型,并用自己的类型去替代
type MyFilterDropdownProps = Omit<FilterDropdownProps, "selectedKeys" | "selectedKeys"> & {
selectedKeys: CustomProps
setSelectedKeys: (selectedKeys: CustomProps[]) => void
}
这个类型就是将 FilterDropdownProps
里忽略它的 selectedKeys
selectedKeys
属性类型,然后用 &
来定义自己的这俩属性类型。
这时候是改动了 FilterDropdownProps , 但是这个使用在antd table 的 column里,牵一发而动全身,column也得改.
同样的用omit
和&
type MyColumnType<T> = Omit<ColumnType<T>, 'filterDropdown'> & {
filterDropdown?: React.ReactNode | ((props: MyFilterDropdownProps) => React.ReactNode);
}
而 column又是Table的属性
type MyTableProps<T> = Omit<TableProps<T>, 'column'> & {
columns?: MyColumnType<T>;
}
然后可以相使用改动后的 MyTable了
type User = {
//
}
// MyTable 可以像普通的Table 一样使用, 因为其类型是我们改造过的 TableProps
// 因此 Table 可以接收的属性 MyTable 也同样可以接收
const MyTable: FC<MyTableProps<User>> = (props) => {
const { xxx, xxx, xxx, ...restProps } = props
const columns: MyColumnType<User>[] = [{
//,
//,
filterDropdown: ({selectedKeys, setSelectedKeys}) => {
// 此时的 selectedKeys 跟 setSelectedKeys 接收的类型已经被改造成 TagProps 了
// 而不是 antd table 定义的类型了
})
}]
return <Table {...restProps} columns={columns} />
}
从这里看,如果我想去拓展某个组件的属性类型,只能引用原始类型,调整后,去封装原始组件,而不能视图修改原始组件的类型?