
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 里面怎么处理name和id的可空性呢?
如果 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){}这样的函数了
1 siweipancc 2024-04-05 10:30:57 +08:00 via iPhone 函数可以有默认值,可以为空值,你再回去看看 es5 跟 t |
2 siweipancc 2024-04-05 10:31:50 +08:00 via iPhone 手快了,再看看 typescript 文档,有 cn 官网 |
3 zhy0216 span class="ago" title="2024-04-05 11:05:42 +08:00">2024-04-05 11:05:42 +08:00 虽然麻烦 但类型更安全 |
4 cctv1005s927 2024-04-05 11:21:27 +08:00 `function foo(x: SomeType | null){}` 这类问题不可避免,因为对于 java 而言,他是有隐式的一个 null 类型,所以你在 ts 中要尽量把类型定义全。我的建议是如果你觉得上面的写法麻烦,可以封装一个新的 type ,例如 `type Maybe<T> = T | null | undefined`,这样复用率会提高一些。 |
5 magicflower 2024-04-05 11:23:22 +08:00 via Android function foo( name: string, id?: nunber){ } |
6 weijancc 2024-04-05 11:29:02 +08:00 第一种情况: 定义一个属性可空类型 1. type Model2=Partial<Model> 2. let model: Model2= { name: "Jack"} 第二种情况: 在 tsconfig 中关闭 typescript 的 strict 模式 |
7 weijancc 2024-04-05 11:29:39 +08:00 Partial\<Model\> |
8 isbase PRO interface Model { name?: string, id?: number }; 定义的时候一律定为 optional 使用的时候,TS 里可以用断言 NonNull ,例如:foo(model.name!) |
9 focuxin 2024-04-06 19:15:52 +08:00 Omit 、Partial |