【问题标题】:How do I declare and define my variable to be nullable?如何声明并将我的变量定义为可为空?
【发布时间】:2021-10-25 16:03:28
【问题描述】:

假设我有一个自定义类;

interface IMyType {
  foo: string
  bar?: IChild
}

现在我想选择性地实例化该类型:

var myType: IMyType = null
if (something) { myType = somethingNotNull }

这会导致;

TS2322:类型“null”不可分配给类型“IMyType”。

所以现在我可以这样做了:

var myType: IMyType | null = null

这似乎可行,但现在我已经使用“?”声明了我的选项。在类声明中,并在其他地方使用“| null”,这看起来真的很丑/乱/不正确。在打字稿中实现一致的可选行为的正确方法是什么?

【问题讨论】:

  • var myType: IMyType | null 是使它可以为空的正确方法。当它在另一个地方也可以是null 时,它必须在那里以同样的方式声明。您可以进行空检查以摆脱其他地方的可为空类型
  • 您可以像type Nullable<T> = T | null; 那样使用它的可读性更高的版本,并像这样var myType: Nullable<IMyType> = null 那样定义您的变量
  • 我认为有一个 tslint 选项可以允许这样做。我的 Angular 项目至少允许这样做,但我不知道是什么配置负责允许它。

标签: typescript


【解决方案1】:

除了我的评论之外,这是一个最小的工作示例。

当一个字段可以为空时,它的类型将是MyType | null。如果您想摆脱 null 部分,您可以检查 null 或将其转换为不可为空的类型。然而,转换是有风险的,因为转换后的变量可能仍然是 null

或者将 null-check 内联到 ?? 并在 null 的情况下指定值。

interface IMyType {
  foo: string, 
  bar?: string,
}

var somethingNotNull: IMyType = {foo: 'foo', bar: 'bar'};

var nullableMyType: IMyType | null = null;

const shouldNotBeNull = false;
if (shouldNotBeNull) {
  nullableMyType = somethingNotNull;
}

var casted: IMyType = nullableMyType as IMyType; // dangerous because casted pretends to be not nullable, but still might be null if myType is null

// var notNull: IMyType = myType; // does not compile: Type 'IMyType | null' is not assignable to type 'IMyType'

if (nullableMyType !== null) {
  var notNull: IMyType = nullableMyType; // does compile
}

var notNull: IMyType = nullableMyType ?? {foo: '', bar: ''}; // Specify value for the null case

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2015-12-31
    • 2021-07-27
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2015-09-04
    • 2012-02-13
    相关资源
    最近更新 更多