TypeScript Declare local variable as optional

wr98u20j  于 4个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(42)

每次我输入一个无法定义的变量,我都觉得我输入错了:

let a: string | undefined;

为什么我觉得我输入错了?这是因为除了在变量声明中,我从未将 undefined 类型添加到联合类型中。
你不觉得是时候将可选操作符也引入到局部变量声明中了吗?

let a?: string;

对我来说,上述语法感觉非常自然和符合TypeScript的惯用法。

kx5bkwkv

kx5bkwkv1#

或者启用严格空值检查的可空局部变量。

sc4hvdpw

sc4hvdpw2#

或者启用严格空值检查的可空局部变量。

let a: string | null;

? 永远不包含 null? 表示参数和属性的“可选”,意味着 T | undefined

igetnqfo

igetnqfo3#

这绝对是必要的。在处理许多可选参数/成员的代码中,来回切换?和类型|未定义是非常痛苦的,因为在实际情况下,这两种情况下你都在处理完全相同的对象(只是有时候作为参数/成员,而其他时候作为局部变量)。

我怀疑人们没有在这个方面下大力气,因为严格空值检查的使用并不像它应该的那样普遍。

C#是一个很好的例子,其中可空的?修饰符同样适用于参数、局部变量和成员。

nhaq1z21

nhaq1z214#

每次我输入一个无法定义的变量,我都觉得我输入错了:

let a: string | undefined;

为什么我觉得我输入错了?因为我从未将 undefined 类型添加到联合类型中,除了在变量声明中。
你不觉得是时候将可选操作符也引入到局部变量声明中了吗?

let a?: string;

对我来说,上面的语法感觉非常自然和符合TypeScript的惯例。
我只是尝试使用 let s? : string = null; 并失败了。lol
猜到它完成之前 let s: string | null; 已经足够了。但是请为 let s? : string = null; 投票。
祝好。

u5rb5r59

u5rb5r595#

我完全同意。请,请,给我们更简洁的语法来表示 T | null !

0md85ypi

0md85ypi6#

虽然这是一个老问题,但我想在这里留下一个备注,以防其他人找到这个。许多库使用泛型使可选语法更美观。例如,将Maybe定义为
type Maybe<T> = T | null;
,然后让你做类似的事情,如 let foo: Maybe<string> = null; 。这并不是真的节省字符,但我认为它读起来更好。也可以做类似的事情
type Nullish<T> = T | null | undefined;

type Opt<T> = T | undefined;

js81xvg6

js81xvg67#

这个去哪里了?

p4tfgftt

p4tfgftt8#

我认为我们不太可能实现这个。从语义上讲,这与类型作为注解提案的定义语法相悖,而且非常令人困惑——变量绝对在那里,只是可能没有初始化,而一个可选的属性可能确实完全缺失。

n53p2ov0

n53p2ov09#

考虑采用更符合函数式编程风格的方法,以减少在定义值之前声明大量变量的需求。尽可能追求不可变性。

相关问题