V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vision1900
V2EX  ›  TypeScript

typescript 动态类型定义问题

  •  
  •   vision1900 · 10 天前 · 553 次点击
    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 实例的方法,求助

    14 条回复    2021-09-13 18:05:05 +08:00
    fgwmlhdkkkw
        1
    fgwmlhdkkkw   10 天前

    可以啊…… Person 应该是个类型
    vision1900
        2
    vision1900   10 天前
    @fgwmlhdkkkw 你这完全回避了我的问题 :(
    fgwmlhdkkkw
        4
    fgwmlhdkkkw   10 天前
    @vision1900 #2 🤭🤭,我刚学……
    vision1900
        5
    vision1900   10 天前
    @EridanusSora 非常 OK,谢谢大佬
    vision1900
        6
    vision1900   10 天前
    @EridanusSora 这种写法好像对自动补全不大友好,我这边编辑器还是告诉我 type 是 any
    Leviathann
        7
    Leviathann   10 天前
    @vision1900 tsc 或者 tsserver 升个级吧,官网的编辑器我试了下是可以拿到 v 的类型的
    EridanusSora
        8
    EridanusSora   10 天前
    @vision1900 render 函数参数的类型么,我这边看是 ok 的,TS Playground 里应该也是可以的,你编辑器用的 TypeScript 版本是?
    pixiaotiao
        9
    pixiaotiao   10 天前 via Android
    动态类型直接用 js 不香么 ts 不就是要使用静态类型的好处么
    vision1900
        10
    vision1900   10 天前
    @Leviathann 官网那个直接把值拿到了
    vision1900
        11
    vision1900   10 天前
    @EridanusSora 我用的 4.4.2,脚手架是 Umi,不知道是不是它的原因
    vision1900
        12
    vision1900   10 天前
    @pixiaotiao 此动态非彼动态
    EridanusSora
        13
    EridanusSora   10 天前
    @vision1900 用的 VSCode 吗,右下角看一下正在用的 TypeScript 版本是项目里的还是其他地方装的
    namelosw
        14
    namelosw   10 天前
    我感觉你的代码写乱了,你上面写了个 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
    }
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2398 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:48 · PVG 08:48 · LAX 17:48 · JFK 20:48
    ♥ Do have faith in what you're doing.