繁体   English   中英

Typescript:“从不”类型上不存在属性“长度”

[英]Typescript: Property 'length' does not exist on type 'never'

我有一套基本的function:

export function isObject(value: any): value is Object {
  return value !== null && typeof value === 'object' && !isArray(value);
}

export function isNumber(value: any): value is number {
  return typeof value === 'number' && !isNaN(value);
}

export function isString(value: any): value is string {
  return typeof value === 'string';
}

export function isArray(value: any): value is Array<any> {
  return Array.isArray(value);
}

export function isNull(value: any): value is null {
  return value === null;
}

export function isUndefined(value: any): value is undefined {
  return value === undefined;
}

export function isNullOrUndefined(value: any): value is null | undefined {
  if (isNull(value) || isUndefined(value)) {
    return true;
  }
  return false;
}

和一个“特殊函数”,用于检查值是否为nullundefinedempty (空字符串、0 表示数字、空数组或空 object {} ):

export function isNullOrUndefinedOrEmpty(value: any): value is null | undefined | '' | [] | {} | 0 {
  if (isNullOrUndefined(value)) {
    return true;
  }
  if (isString(value)) {
    return value === '';
  }
  if (isNumber(value)) {
    return value === 0;
  }
  if (typeof value === 'number' && isNaN(value)) {
    return true;
  }
  if (isArray(value)) {
    return value.length <= 0;
  }
  if (isObject(value)) {
    return Object.keys(value).length === 0 && value.constructor === Object;
  }
  return false;
}

当我使用isNullOrUndefinedOrEmpty() typescript 时显示错误:

“从不”类型上不存在属性“长度”,例如:

export function foo(myArray: Array<any>): Array<any> {
  if (isNullOrUndefinedOrEmpty(myArray)) {
    return myArray;
  }
  // on myArray: Property 'length' does not exist on type 'never'
  for (let i = 0, e = myArray.length; i < e; i++) {
    // ... some logic
  }
  return myArray;
}

我做错了什么?

在线演示

在 TypeScript 中, { foo: any; bar: any } { foo: any; bar: any }表示“任何至少具有属性foobar的值”。 值得注意的是,具有更多属性的值也将适合该类型。

因此, {}表示“至少没有任何值的任何值”。 由于所有值都至少没有任何内容(即使是nullundefined ),它们都适合该类型。 所以在消除{}后,只剩下不可能的情况( never )。

我不知道在 TypeScript 中表达“仅空对象”的方法。 但是如果你只用 arrays 调用 function,那么这个签名可以代替:

function isNullOrUndefinedOrEmpty(x: any[]): x is null | undefined | [] {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM