函数如何检查打字稿中的null?

时间:2017-12-08 13:27:31

标签: javascript typescript

in typescript 2.6我想编写一个执行空检查的函数。当我启用严格的空检查时,typescript 2.6会抱怨以下代码。 (注意,当使用null检查直接工作时)

已修改:已更正notNullOrUndefined,因为它没有检查foo

interface A {
  foo: string | undefined;
}
const notNullOrUndefined = (a: A): boolean => {
  return a.foo != null;
}
const len = (a: A): number => {
  //if (a.foo != null) {
  if (notNullOrUndefined(a)){
    return a.foo.length;
  }
  return 0;
} 

以下是使用的示例:example

解决此问题的打字稿方式是什么?

5 个答案:

答案 0 :(得分:2)

编辑:更新以反映修正有问题的拼写错误:问题有点令人困惑,因为notNullOrUndefined()根本没有检查a.foo,所以它是'毫不奇怪,那些会有所不同。

请注意,启用--strictNullChecks时,您已定义len(),因此a参数为A,因此不能为空或未定义。因此,您不必在a函数实现中检查len()本身;相反,您需要确保传递给len()的任何内容都是有效的A。因此,notNullOrUndefined()是一个糟糕的名称,因为您正在检查参数的foo值,而不是参数本身。随意将其更改为fooPropertyIsNotNull();我现在就离开了。

这里的主要问题是TypeScript识别出if (a.foo != null) { ... }type guard,并在a.foo子句中将string缩小为{ ... }。但是类型保护不会自动propagate出功能,因此TypeScript并不了解notNullOrUndefined()本身就是一个类型保护。

幸运的是,这个问题很常见,TypeScript提供user-defined type guards:如果你有一个返回boolean的函数,它缩小了其中一个参数的类型,你可以改变{{1}使用boolean语法将类型返回到类型谓词。这是x is T

notNullOrUndefined()

所以函数签名说:如果传入const notNullOrUndefined = (a: A): a is { foo: string } => { return a.foo != null; } ,它将返回一个布尔值。如果它返回A,则传入的参数将缩小为true。现在你不会得到任何错误,如你所愿:

{ foo: string }

希望有所帮助,祝你好运!

答案 1 :(得分:0)

此代码将检查null。

if(re.search(r'ata de audiência' or r'termo de audiência') and r'inconcilia' and r'reclamada' and r'reclamante' and not r'sentença', content.read())):
            key_content = True

输出:

"use strict";

function isNull(something: any) {
    return something === null;
}

function checkForNull() {
    console.log(isNull(''));
    console.log(isNull(null));
    console.log(isNull(undefined));
}

checkForNull();

答案 2 :(得分:0)

您需要同时检查aa.foo。例如,即使未启用严格的空检查,此代码也会起作用:

const len = (a: A): number => {
  if (a != null && a.foo != null){
    return a.foo.length;
  }
  return 0;
} 

如果您确实启用了严格的空检查,则您已经知道a未定义,然后您可以使用注释掉的行:

const len = (a: A): number => {
  if (a.foo != null){
    return a.foo.length;
  }
  return 0;
} 

如果要在单独的函数中执行测试,则应该使该函数成为类型断言。例如,您可以从undefined的类型中移除foo,但在您不知道Partial<A>是否存在的任何地方使用foo

interface A {
  foo: string;
}
const notNullOrUndefined = (a: Partial<A>): a is A => {
  return a != null && a.foo != null;
}
const len = (a: Partial<A>): number => {
  if (notNullOrUndefined(a)){
    return a.foo.length;
  }
  return 0;
} 

答案 3 :(得分:0)

这就是我讨厌strictNullChecks的原因。它不支持从函数内部进行类型检查以“冒泡”到调用检查的位置。

if (a && a.foo) {
   return a.foo.length;
}

按预期工作。对我来说,将以下内容包装在函数中......

const hasFoo(a: A) => !!a && 'foo' in a && typeof a.foo === 'string';

...

if (hasFoo(a)) {
   return a.foo.length;
}

...

......应该作为初步检查。但事实并非如此。

解决方案(并且唯一的解决方案)是使用新的!.后缀表达式。这声称该值确实被声明为预期类型。

if (hasFoo(a))
{
   return a.foo!.length;
}

答案 4 :(得分:-1)

您可以直接使用!!进行null和undefined check。

interface A {
  foo: string | undefined;
}

//const notNullOrUndefined = (a: A): boolean => {
  //return a != null;
//}

const len = (a: A): number => {
  if (!!a.foo) {
  // if (notNullOrUndefined(a)){
    return a.foo.length;
  }
  return 0;
}