如何告诉 TypeScript 我的对象的类型?

让我们从一些代码开始:

export function toArrayStrict(obj: Iterable<any>): any[] {
    if(obj) {
        if(isArray(obj)) {
            return obj; // error TS2322: Type 'Iterable<any>' is not assignable to type 'any[]'.

        }
        if(isFunction(obj[Symbol.iterator])) {
            return [...obj];
        }
    }
    throw new Error(`Cannot convert ${getType(obj)} to array; it is not iterable.`);
}

当我尝试编译它时,这会引发错误:

错误 TS2322:类型“Iterable”不可分配给类型“any[]”。

我完全明白。它不知道我已经验证obj过实际上是any[]

我的问题是,我如何告诉isArray正在检查类型的编译器,这实际上是安全的?

请注意,我知道如果我改用错误会消失Array.isArray这个问题不是关于那个。我想知道我如何判断tsc类型是什么。

尼赞托玛

您需要使用用户定义的类型保护

function isArray(obj: any): obj is Array<any> {
    return obj instanceof Array;
}

function isFunction(obj: any): obj is Function {
    return typeof obj === "function";
}

if (isArray(obj)) {
    return obj; // should be fine now
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何告诉 TypeScript 我正在返回输入类型的数组数组?

TypeScript:如何告诉TypeScript我在哪种情况下?

如何告诉TypeScript对象[foo]的类型是所有可能的object.prop类型的子集

如何使用Lodash中的mapKeys告诉TypeScript什么类型的东西?

如何告诉TypeScript我的函数参数是Enum键?

如何告诉 TypeScript 我正在处理使用字符串访问对象上不存在的属性的情况?

如何告诉TypeScript我的属性可以是布尔值还是具有特定签名的函数?

在 TypeScript 中,如何指定对象中值的类型?

TypeScript:如何设置解构对象的类型?

在C ++中,我如何告诉WHICH代码正在分配什么类型的对象?

有人可以告诉我如何禁用@ typescript-eslint / ban-types触发的所有内容吗?

我如何告诉AngularJS“刷新”

如何基于现有对象值定义Typescript对象类型?

我可以告诉TypeScript泛型类型具有构造函数吗?

Typescript告诉我'string'类型不存在属性'padStart'。为什么?

如何将TypeScript对象类型转换为TypeScript中的联合类型,如Object.values()?

Makefile不构建对象我如何告诉它

如何告诉TypeScript订阅函数的结果是x的数组?

如何使Typescript推断对象的键但定义其值的类型?

如何根据 switch case 为 TypeScript 中的对象分配类型

如何在Typescript中按属性过滤对象类型的并集?

如何从TypeScript中的类型化对象中动态删除键

如何从Typescript中的固定对象的键创建映射类型

如何在TypeScript的运行时检查对象类型?

如何从Typescript / Angular 7中的对象变量获取类型?

如何在TypeScript中指定类型化的对象文字?

如何在Typescript中保留映射对象的类型

对象或布尔值如何在Typescript中声明类型

如何使TypeScript类型保护器没有任何对象?