【问题标题】:Lint why not allow null to be assigned?Lint 为什么不允许分配 null?
【发布时间】:2019-03-11 04:02:00
【问题描述】:

我正在关注quide,但我选择不禁用 TSLint 默认设置。但是也许我应该有,因为现在当我尝试分配 null(给任何类型)时它会给我一条错误消息:

function f()
{
    const a :string = null; //Type 'null' is not assignable to type 'string'
    return a;
}

f();

数字也一样。我的问题是为什么 TSLint 选择完全禁用此类构造。另外,如果我改为分配这样的空字符串,是否可以:

    const a :string = "";

【问题讨论】:

    标签: typescript tslint


    【解决方案1】:

    这不是 TSLint 错误 - 它是由您的 tsconfig.json 文件启用了 strictNullChecks 设置引起的。这使得 null 对于所有未明确声明它们可以为 null 的类型都是无效值。

    以下是行为差异的示例 (playground link):

    let a: string = null;         // This fails with strictNullChecks
    let b: string | null = null;  // This does not
    

    这意味着,如果您禁用了该设置,则实际上每个 Type 都会被视为在后台处理 Type | null | undefined

    那么,您为什么要启用这样的功能呢?乍一看似乎相当不方便,但好处在于它允许您在编译时而不是在运行时捕获空指针错误。

    考虑以下函数 (playground link):

    function parseCSV(input: string): string[] {
        return input.split(","); // If input is null, this will error!
    }
    

    禁用strictNullChecks 后,您可以调用parseCSV(null),在您实际运行代码之前不会收到错误消息。启用后,传入null会导致编译错误!

    在理想的世界中(至少在我看来!),这将是默认设置,但是由于大量现有的 JavaScript 代码会鲁莽地放弃 nulls/undefined,因此决定应该选择该设置以实现兼容性清酒。如果出于某种原因您不希望这种行为,那么您可以将该设置更改为 false 或将其从配置文件中删除以恢复为默认值。

    【讨论】:

    • 任何更多解释为什么我想要这个设置 - 将不胜感激,因为我是这个打字稿的新手。
    • @AnArrayOfFunctions:扩展了我的答案。
    • @AnArrayOfFunctions:刚刚添加了一个更实用的示例,说明您可能希望启用该设置的原因 - 希望它有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多