Typescript和过滤器布尔值

时间:2017-12-04 11:43:38

标签: typescript strictnullchecks

strictNullChecks开启后,请考虑关注code

var a: (number | null)[] = [0, 1, 2, 3, null, 4, 5, 6];
var b: { value: number; }[] = a.map(x => x != null && { value: x }).filter(Boolean);

由于以下原因无法编译:

Type '(false | { value: number; })[]' is not assignable to type '{ value: number; }[]'.
  Type 'false | { value: number; }' is not assignable to type '{ value: number; }'.
    Type 'false' is not assignable to type '{ value: number; }'.

但绝对清楚的是,false会被.filter(Boolean)过滤掉。

null相同的问题。

有没有办法(写as number[]除外)标记该值不包含falsenull

3 个答案:

答案 0 :(得分:3)

如果您确实不想更改生成的JavaScript,而是希望强制TypeScript编译器识别出Boolean正在防范false值,则可以执行以下操作:

type ExcludesFalse = <T>(x: T | false) => x is T;     
var b: { value: number; }[] = a
  .map(x => x != null && { value: x })
  .filter(Boolean as any as ExcludesFalse);

这是有效的,因为您断言Booleantype guard,并且因为Array.filter()overloaded,如果回调是类型保护,则返回缩小的数组。< / p>

以上(Boolean as any as ExcludesFalse)是我能提出的最干净的代码,它既可以工作又不会改变生成的JavaScript。常量Boolean被声明为全局BooleanConstructor接口的一个实例,您可以将ExcludesFalse类似的类型保护签名合并到BooleanConstructor中,但不能在某种程度上合并这样你就可以说出.filter(Boolean)并让它发挥作用。您可以通过类型防护来获得更好的机会,并尝试代表防范所有虚假值(except NaN),但您不需要为您的示例。

无论如何,希望有所帮助;祝好运!

答案 1 :(得分:2)

只需使用.filter删除所有null值,并使用.map提供默认值,如果值为null,则不会因为filter

var a: (number | null)[] = [0, 1, 2, 3, null, 4, 5, 6];
var b: { value: number; }[]  = a.filter(x => x != null).map(x => ({ value : x || 0 }));

答案 2 :(得分:2)

您可以使用类似的功能

function nonNullable<T>(value: T): value is NonNullable<T> {
  return value !== null && value !== undefined;
}

type Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T; // from lodash

function truthy<T>(value: T): value is Truthy<T> {
    return !!value;
}

[1, 2, 0, null].filter(nonNullable) // number[]
[1, 2, 0, null].filter(truthy) // number[]

不可为空- https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#predefined-conditional-types