
export interface Column<T> { dataIndex: keyof T; title: ReactNode; render: (value: any, record: T, index: number) => RactNode; } const Person = { name: "John", age: 10 }; const cols: Column<Person> = [ { dataIndex: "name", // this has autocompletion title: "Client Name", render: (v) => v.toLowerCase() // v is of type any, no autocompletion } ] 我想基于 T & dataIndex 动态定义 render 的第一个参数 value, 大概像这样
value: typeof Person["dataIndex"] 可是 ts 不太熟悉,上网也没查到如何在 interface 里面去 reference 实例的方法,求助
1 fgwmlhdkkkw 2021-09-13 14:50:57 +08:00 |
2 vision1900 OP @fgwmlhdkkkw 你这完全回避了我的问题 :( |
3 EridanusSora 2021-09-13 15:09:23 +08:00 |
4 fgwmlhdkkkw 2021-09-13 15:17:58 +08:00 @vision1900 #2 ,我刚学…… |
5 vision1900 OP @EridanusSora 非常 OK,谢谢大佬 |
6 vision1900/a> OP @EridanusSora 这种写法好像对自动补全不大友好,我这边编辑器还是告诉我 type 是 any |
7 Leviathann 2021-09-13 15:40:02 +08:00 @vision1900 tsc 或者 tsserver 升个级吧,官网的编辑器我试了下是可以拿到 v 的类型的 |
8 EridanusSora 2021-09-13 15:41:33 +08:00 @vision1900 render 函数参数的类型么,我这边看是 ok 的,TS Playground 里应该也是可以的,你编辑器用的 TypeScript 版本是? |
9 pixiaotiao 2021-09-13 16:25:29 +08:00 via Android 动态类型直接用 js 不香么 ts 不就是要使用静态类型的好处么 |
10 vision1900 OP @Leviathann 官网那个直接把值拿到了 |
11 vision1900 OP @EridanusSora 我用的 4.4.2,脚手架是 Umi,不知道是不是它的原因 |
12 vision1900 OP @pixiaotiao 此动态非彼动态 |
13 EridanusSora 2021-09-13 17:04:44 +08:00 @vision1900 用的 VSCode 吗,右下角看一下正在用的 TypeScript 版本是项目里的还是其他地方装的 |
14 namelosw 2021-09-13 18:05:05 +08:00 我感觉你的代码写乱了,你上面写了个 interface Column,下面又把 Column 直接 = [],你的 Column 和数组之间没有任何关系。 我理解你是不是想表达这样,这样写是可以补全 v.name 的: type ReactNode = {} export interface Column<T> { dataIndex: keyof T; title: ReactNode; render: (record: T) => ReactNode; } const Person = { name: "John", age: 10 }; const cols: Column<typeof Person> = { dataIndex: "name", title: "Client Name", render: (v) => v.name } |