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

后端 Java 类型映射到前端 TypeScript 类型时,对可空性(nullability)怎么处理?

  •  
  •   movq · 25 天前 · 1289 次点击

    Java 的类型检查是不会强制一个变量可不可以为 null 的,但是 TS 里面,如果一个变量为 null ,那么当初声明时就要把它的类型定义为 SomeType | null。接着,你有一个要用这个变量的函数,那么这个函数就得写成function foo(x: SomeType | null){}。这样不感觉很麻烦么

    比如有个 Java 类型

    class Model{
    	String name;
        Integer id;
       }
    

    这里面 name 和 id 都是可以为空的,而且如果有个函数是

    void foo(String name, Integer id){
    	System.out.println(name);
        System.out.println(id);
    }
    

    var model = new Model()然后调用foo(model.name, model.id),是不会让 Java 编译器报错的

    把这个 Model 映射到前端,ts 里面怎么处理nameid的可空性呢?

    如果 interface 这么写:

    interface Model {
        name: string,
        id: number
    };
    

    那么我就没办法传递一个只有 id 没有 name 的 Model 类型的对象到后端了,因为

    let model: Model = { name: "Jack"}
    

    是会报错的,提示缺少 id 属性。

    如果我定义成这样:

    interface Model {
        name: string,
        id?: number
    };
    

    那么 id 的实际类型就变成了number|undefined,那么它就没法直接传递给function foo(n: number){}这样的函数了

    9 条回复    2024-04-06 19:15:52 +08:00
    siweipancc
        1
    siweipancc  
       25 天前 via iPhone
    函数可以有默认值,可以为空值,你再回去看看 es5 跟 t
    siweipancc
        2
    siweipancc  
       25 天前 via iPhone
    手快了,再看看 typescript 文档,有 cn 官网
    zhy0216
        3
    zhy0216  
       25 天前
    虽然麻烦 但类型更安全
    cctv1005s927
        4
    cctv1005s927  
       25 天前
    `function foo(x: SomeType | null){}`

    这类问题不可避免,因为对于 java 而言,他是有隐式的一个 null 类型,所以你在 ts 中要尽量把类型定义全。我的建议是如果你觉得上面的写法麻烦,可以封装一个新的 type ,例如

    `type Maybe<T> = T | null | undefined`,这样复用率会提高一些。
    magicflower
        5
    magicflower  
       25 天前 via Android
    function foo( name: string, id?: nunber){ }
    weijancc
        6
    weijancc  
       25 天前
    第一种情况: 定义一个属性可空类型
    1. type Model2=Partial<Model>
    2. let model: Model2= { name: "Jack"}

    第二种情况: 在 tsconfig 中关闭 typescript 的 strict 模式
    weijancc
        7
    weijancc  
       25 天前
    Partial\<Model\>
    isbase
        8
    isbase  
       24 天前
    interface Model {
    name?: string,
    id?: number
    };

    定义的时候一律定为 optional

    使用的时候,TS 里可以用断言 NonNull ,例如:foo(model.name!)
    focuxin
        9
    focuxin  
       24 天前
    Omit 、Partial
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2630 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:14 · PVG 22:14 · LAX 07:14 · JFK 10:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.