首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript自定义typeguard返回false,即使它是正确的类型

TypeScript自定义typeguard返回false,即使它是正确的类型
EN

Stack Overflow用户
提问于 2020-07-30 06:50:39
回答 2查看 17关注 0票数 0

所以我最近开始学习TypeScript,我一直在尝试加入typeguards,但它们似乎不起作用。所以我的布局方式是我有一个名为IColor的接口,设置如下:

代码语言:javascript
复制
interface IColor {
    r:number;
    g:number;
    b:number;
}

我有一个名为Color的具体实现,设置如下:

代码语言:javascript
复制
class Color implements IColor {
    static IsColor = (obj:any):obj is IColor => typeCheck<IColor>(obj, "r", "g", "b");

    r:number;
    g:number;
    b:number;

    ... (rest of the class)
}

typeCheck<T>看起来像这样:

代码语言:javascript
复制
export const typeCheck = <T>(objToCheck:any, ...props:Array<keyof T>):objToCheck is T => {
    let isType:boolean = true;
    for(let prop in props){
        if(!propertyCheck(objToCheck, prop)){
            isType = false;
        }
    }
    return isType;
}

export const propertyCheck = <T>(objToCheck:any, prop:keyof T):objToCheck is T => (objToCheck as T)[prop] !== undefined;

但是,当我调用Color.IsColor({r: 100, g: 0, b: 0})时,或者即使我使用像Color.IsColor(new Color(100, 0, 0))这样的颜色对象调用它,我也会得到false,即使它检查了所有的属性。有没有人知道为什么会发生这种情况,以及我如何才能修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-30 07:03:07

好吧,看起来我只是在装傻,我需要使用for...of循环而不是for...in循环

票数 1
EN

Stack Overflow用户

发布于 2020-07-30 07:04:42

bug在这里:

代码语言:javascript
复制
for(let prop in props){ 

props是一个数组,并且for/in迭代键,而不是值。所以for (let prop in props)是指prop"0""1""2"等。

将其更改为通过for/of迭代值,它应该会像您预期的那样工作。

代码语言:javascript
复制
for(let prop of props){

Playground

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63163596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档