V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mokevip
V2EX  ›  问与答

有没有熟悉 ts 的大佬,想问类型定义的问题

  •  
  •   mokevip · 2022-06-22 14:48:39 +08:00 · 749 次点击
    这是一个创建于 667 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求描述

    大概意思是请求时大部分接口需要用到

    {
    	page: 1,
    	limit: 50
    }
    

    但是实际请求时参数可能是

    {
    	page: 1,
    	limit: 50,
    	id: 40,
    	name: '王'
    }
    

    正常会需要

    interface AReq extends PageDto {
    	id: 40,
    	name: '王'
    }
    
    function getName(data: AReq){}
    

    想要实现的效果

    function getName(data: PageDto<{
    	id: 40,
    	name: '王'
    }>){}
    

    个人认为这样可以少定义一些内容,让单个请求整体性更强。 但是不知道怎么写

    尝试

    大概了解泛型,但是目前尝试下来只能映射子级的,如

    export interface PageDto<T> {
    	page: 1,
    	limit: 50,
        data: T
    }
    

    还有用泛型合并,但是,代码提示:'应为“?”' 不太清楚写法具体是怎么样的

    export type Concat<T, U> = T extends U;
    

    问题

    请问有什么方法能够复用定义在同一级扩展呢?

    TWorldIsNButThis
        1
    TWorldIsNButThis  
       2022-06-22 14:56:31 +08:00 via iPhone
    page 和 query 应该分成两个参数吧
    TWorldIsNButThis
        2
    TWorldIsNButThis  
       2022-06-22 14:57:56 +08:00 via iPhone
    一定要这么做的话,直接 T&U 不就好了
    AlekoShen
        3
    AlekoShen  
       2022-06-22 14:58:18 +08:00
    不会 ts 但看女票玩过这个 https://github.com/type-challenges/type-challenges/blob/main/README.zh-CN.md
    我记得有类似的语法 依稀记得是在简单题里面有类似的 如果是想学 TS 类型系统 我觉得这个网站是一个很不错的选择
    hua123s
        4
    hua123s  
       2022-06-22 15:06:26 +08:00
    export type PageDto<T> = {
    page: 1;
    limit: 50;
    } & T;
    hronro
        5
    hronro  
       2022-06-22 15:06:26 +08:00
    export type PageDto<T extends object>={
    [key in keyof T]: T[key];
    }&{
    page: number;
    limit: number;
    };
    noe132
        6
    noe132  
       2022-06-22 15:16:33 +08:00
    type WithPageAndLimit<T> = T & { page: number, limit: number }
    mokevip
        7
    mokevip  
    OP
       2022-06-22 15:20:48 +08:00
    @TWorldIsNButThis
    @hua123s
    @hronro
    @noe132

    感谢回复在各位告知之前从来没看到类似的文档。。。刚刚已经试了,可以了,谢谢大家
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2643 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:11 · PVG 13:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.