我有一组基本功能:
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;
}
和一个“特殊函数”来检查一个值是否是null
, undefined
or empty
(空字符串、0 表示数字、空数组或空对象{}
):
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()
打字稿显示错误:
属性“length”在类型“never”上不存在,例如:
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;
}
我做错了什么?
在打字稿中,{ foo: any; bar: any }
意思是“任何具有at least特性foo
and bar
”。值得注意的是,具有更多属性的值也适合该类型。
那么,由此可见{}
意思是“任何具有at least什么都没有”。因为所有的价值观都至少没有任何内容(甚至null
and undefined
),它们都适合该类型。所以消除后{}
只有不可能的情况(never
) left.
我不知道如何在 TypeScript 中表达“仅空对象”。但如果您仅使用数组调用该函数,则此签名可以起作用:
function isNullOrUndefinedOrEmpty(x: any[]): x is null | undefined | [] {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)