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
解决此问题的打字稿方式是什么?
答案 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)
您需要同时检查a
和a.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;
}