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

41 天前
 movq

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){}这样的函数了

1376 次点击
所在节点    程序员
9 条回复
siweipancc
41 天前
函数可以有默认值,可以为空值,你再回去看看 es5 跟 t
siweipancc
41 天前
手快了,再看看 typescript 文档,有 cn 官网
zhy0216
41 天前
虽然麻烦 但类型更安全
cctv1005s927
41 天前
`function foo(x: SomeType | null){}`

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

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

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

定义的时候一律定为 optional

使用的时候,TS 里可以用断言 NonNull ,例如:foo(model.name!)
focuxin
40 天前
Omit 、Partial

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1029812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX