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

typescript 的类型处理

  •  
  •   yxcoder · 299 天前 · 1318 次点击
    这是一个创建于 299 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1 、interface

    interface TypeD{
        subTypeA: string;
        subTypeB: number;
    }
    interface TypeProp{
        typeA: string;
        typeB: number;
        typeC: boolean;
        typeD: TypeD;
    }
    

    2 、data

    const data1: TypeProp = {
        typeA: 'yes',
        typeB: 1,
        typeC: true,
        typeD: {
        	subTypeA: 'no',
            subTypeB: 0,
        }
    }
    

    3 、function

    const dosomething = (data: keyof TypeProp):[?] => {
    	return data1[data]
    }
    

    请问 [?] 处我需要怎么处理(或者我需要如何定义 dosomething),才能表示返回的是 data1[data]的类型

    我想要的

    const b = dosomething('typeB') // b 是 number 类型
    const c = dosomething('typeC') // c 是 boolean 类型
    const d = dosomething('typeD') // d 是 TypeD 类型
    
    8 条回复    2024-01-19 20:32:11 +08:00
    lzgshsj
        1
    lzgshsj  
       299 天前
    const dosomething = <T extends keyof TypeProp>(data: T): TypeProp[T] => {
    return data1[data];
    }
    Gaoti
        2
    Gaoti  
       299 天前
    ```typescript
    function dosomething<K extends keyof TypeProp>(data: K): TypeProp[K] {
    return data1[data];
    }
    ```

    善用泛型
    yxcoder
        3
    yxcoder  
    OP
       299 天前
    @Gaoti
    @lzgshsj

    请问一下,如果 dosomething 里面涉及到数组应该怎么处理的
    yxcoder
        4
    yxcoder  
    OP
       299 天前
    @yxcoder

    譬如我希望
    const dosomething = (data: keyof TypeProp | keyof TypeProp[]) => { ... }
    yxcoder
        5
    yxcoder  
    OP
       299 天前
    @yxcoder const dosomething = (data: keyof TypeProp | (keyof TypeProp)[]) => { ... }
    MinonHeart
        6
    MinonHeart  
       299 天前
    可能类似这样吧,假设都返回对象形式
    get(keys: keyof T): Pick<T, keyof T>;
    get<U extends keyof T, K extends U[]>(keys: K): Pick<T, K[number]>;
    Gaoti
        7
    Gaoti  
       299 天前
    @yxcoder #5

    ``` typescript
    function dosomething<K extends keyof TypeProp>(data: K): TypeProp[K];

    function dosomething<K extends keyof TypeProp>(
    data: K[],
    ): { [P in K]: TypeProp[P] }[];

    function dosomething<K extends keyof TypeProp>(
    data: K | K[],
    ): TypeProp[K] | TypeProp[K][] {
    if (Array.isArray(data)) {
    return data.map((key) => data1[key]);
    } else {
    return data1[data];
    }
    }
    ```
    Track13
        8
    Track13  
       299 天前 via Android
    类型体操里有这种。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:12 · PVG 12:12 · LAX 20:12 · JFK 23:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.