Typescript 为什么是;弦乐;“数字”;未评估为;决不;打字稿?

Typescript 为什么是;弦乐;“数字”;未评估为;决不;打字稿?,typescript,Typescript,我在试验Typescript中常见基本类型之间的一些交叉点 默认情况下,null和undefined是所有其他类型的子类型。这意味着您可以将null和undefined赋值给类似number的对象 但是,当使用--stricnullchecks标志时,null和undefined仅可分配给unknown、any及其各自的类型(一个例外是undefined也可分配给void)。这有助于避免许多常见错误。如果要传入字符串或null或undefined,可以使用union类型字符串| null |

我在试验Typescript中常见基本类型之间的一些交叉点

默认情况下,null和undefined是所有其他类型的子类型。这意味着您可以将null和undefined赋值给类似number的对象

但是,当使用--stricnullchecks标志时,null和undefined仅可分配给unknown、any及其各自的类型(一个例外是undefined也可分配给void)。这有助于避免许多常见错误。如果要传入字符串或null或undefined,可以使用union类型字符串| null | undefined

以下是我运行的测试:

鉴于
null
undefined
是所有其他类型的子类型(当禁用
--strictNullChecks
时),我想所有结果都有意义,除了一个:

type STRING_NUMBER = string & number;     // string & number 
字符串和数字
不应该永远都是


我还运行了启用了
--strictNullChecks
的测试

鉴于使用
strictNullChecks
未定义的
null
只能分配给
未知的
任何的
,那么下面的所有检查不应该被评估为
从不
,而不是交叉点吗

type STRING_UNDEFINED  = string & undefined; // string & undefined
type STRING_NULL       = string & null;      // string & null

type NUMBER_UNDEFINED  = number & undefined; // number & undefined
type NUMBER_NULL       = number & null;      // number & null

我想这是因为TS算法。即使将某个交叉点而不是
从不
,作为工具提示,该行为与
从不
没有区别。例如,如果启用了
strictNullChecks
,则不能为类型为
string&undefined
undefined
的变量赋值。@hrefа。但是看看这个。他似乎以一种非
从不
的方式使用
字符串和数字。你认为呢?如果你尝试一下这个答案中的代码,并将
替换为string&number
而将
替换为
as never
,你将看不到任何区别。这是因为
never
type是任何其他类型的子类型。这是一种证明,
string&number
总是解析为
never
,即使TS在工具提示中显示了不同的内容。当然,也许我错了:)另外,如果你在操场上切换到最新版本的TS,你会看到预期的类型:)你是对的。如果你愿意,可以写一个答案。谢谢。我想这是因为TS算法。即使将某个交叉点而不是
从不
,作为工具提示,该行为与
从不
没有区别。例如,如果启用了
strictNullChecks
,则不能为类型为
string&undefined
undefined
的变量赋值。@hrefа。但是看看这个。他似乎以一种非
从不
的方式使用
字符串和数字。你认为呢?如果你尝试一下这个答案中的代码,并将
替换为string&number
而将
替换为
as never
,你将看不到任何区别。这是因为
never
type是任何其他类型的子类型。这是一种证明,
string&number
总是解析为
never
,即使TS在工具提示中显示了不同的内容。当然,也许我错了:)另外,如果你在操场上切换到最新版本的TS,你会看到预期的类型:)你是对的。如果你愿意,可以写一个答案。谢谢
// --strictNullChecks ENABLED

type BOOLEAN_STRING    = boolean & string;    // NEVER  
type BOOLEAN_NUMBER    = boolean & number;    // NEVER  
type BOOLEAN_UNDEFINED = boolean & undefined; // NEVER
type BOOLEAN_NULL      = boolean & null;      // NEVER

type STRING_NUMBER     = string & number;    // string & number  

type STRING_UNDEFINED  = string & undefined; // string & undefined
type STRING_NULL       = string & null;      // string & null

type NUMBER_UNDEFINED  = number & undefined; // number & undefined
type NUMBER_NULL       = number & null;      // number & null
type STRING_UNDEFINED  = string & undefined; // string & undefined
type STRING_NULL       = string & null;      // string & null

type NUMBER_UNDEFINED  = number & undefined; // number & undefined
type NUMBER_NULL       = number & null;      // number & null