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){}
这样的函数了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.