export interface Column<T> {
dataIndex: keyof T;
title: ReactNode;
render: (value: any, record: T, index: number) => ReactNode;
}
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 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 } |