将 null 定义为数据类型有啥用?

Posted

技术标签:

【中文标题】将 null 定义为数据类型有啥用?【英文标题】:What is the use of defining null as a data type?将 null 定义为数据类型有什么用? 【发布时间】:2019-02-25 12:09:56 【问题描述】:

我们正在学习TypeScript,在声明变量时,我们也尝试像这样指定它的类型

let a: number = 5;
let b: boolean;
let c: string;
let d: any;

let e: number[] = [1, 2, 3, 4, 5];
let f: any[] = [true, 'foo', 4.09, []];

let g: null;

这些anynull 对我们来说是新的,我们能够理解any 的概念,但它与null 混淆了。这是我们第一次听说null 作为data type,我们听说null 作为Java 中的一个值。真正令人困惑的是为什么有人需要null 这样的数据类型。

在 Java 中,我们将变量声明为

int a = 0;
double b = 0.0;
char c = 'c';
String x = "abc";

但是如果null是一个数据类型,就会是这样的

null a;

我们发现很难理解这个概念!如果将 null 分配给一个变量,这很酷,什么都没有就是这样,但是将 null 作为数据类型的目的是什么?所以我们看了一些网站

Data types in TypeScript - 这里说当一个对象没有任何值时使用它,但这是否意味着如果一个对象没有值或指定 null 作为类型对那些没有任何价值的物品?

在 How to declare a type as nullable in TypeScript? 和 TypeScript: Define type that can be bool or null 中,讨论的是关于将 null 分配/返回给某个变量。

那么任何人都可以帮助我们清除 null 被用作数据类型的概念吗?

【问题讨论】:

【参考方案1】:

javascript 和 TypeScript 中,null 是一个非常好的。你是对的,它或多或少地代表了虚无,但有一个代表某物不存在的值是件好事。考虑:

let supervisor = "None"    // I have a supervisor named "None"
let supervisor = null      // I DON'T HAVE a supervisor
let supervisor = undefined // Maybe I have a supervisor, maybe
                           // I don't, I don't know or care, or
                           // none of your business

现在您询问了null 作为一种类型。伟大的!值null 和类型null 之间很容易混淆。但这里是你如何理解它。 TypeScript 有 unit types,它们是只有一个值的类型。你知道5 是一种类型吗? (它是唯一值是数字5的类型。你知道"dog"是一个类型吗?(唯一值是"dog"的类型。是的,你可以说:

let x: "dog" = "dog";
let y: 5 = 5;

现在由于null 是一个值,所以也存在一个称为null 的类型。它是唯一值为null 的类型。它是一个单元类型,就像上面的两个一样。

let z: null = null;

现在,如果您的问题是“我为什么要在实际应用程序中声明这样的类型?”这也是个好问题。也许您可能不会显式地声明这样的类型,但您很可能想要这样的类型:

number | null

这可能是将字符串转换为数字的函数的结果类型。注意联合类型T1 | T2,其中 T1 和 T2 是类型。如果没有null这样的类型,那么number | null就不会是两种类型的并集,事情就会很奇怪。当你有单位类型时,事情会变得更加干净!既然null 是一个值,那么就需要有一个类型null 只包含值null

【讨论】:

哇,这真的很有趣,它完全不同的视图,let x: "dog" = "do"; 给出了错误,并且只有在像let x: "dog" = "dog"; 这样编写时才会编译。很酷,谢谢,它说我们还有很长的路要走:):) 有关单位类型(以及所有其他类型)的更多信息,我推荐this section of Anders Hejlsberg's talk at Build 2018,我认为它会对您有很大帮助。干杯。 @ArunSudhakaran 还有一个好处是有function favorite(pet:"cat"|"dog") 这样的东西,所以你只能输入"cat""dog",但不能输入"fish"

以上是关于将 null 定义为数据类型有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

java里的自定义注解类型 有啥用?

PostgreSQL 中 JSONB[] (JSONB ARRAY) 数据类型有啥用?

java 中byte数组存的是啥类型的数据,byte数组有啥用

odbc数据源有啥用

HTML表单input里面的value有啥用?

java的enum到底有啥用?