【问题标题】:TypeScript Custom typeguard returns false even when it is the correct type即使是正确的类型,TypeScript 自定义类型保护也会返回 false
【发布时间】:2020-07-29 22:50:38
【问题描述】:

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

interface IColor {
    r:number;
    g:number;
    b:number;
}

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

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&lt;T&gt; 看起来像这样:

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)) 这样的 Color 对象调用它时,我也会得到 false,即使它已经检查了所有属性。有谁知道为什么会发生这种情况以及我该如何解决?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    好吧,看来我只是愚蠢,我需要使用 for...of 循环而不是 for...in 循环

    【讨论】:

      【解决方案2】:

      错误就在这里:

      for(let prop in props){ 
      

      props 是一个数组,for/in 迭代的是键,而不是值。所以for (let prop in props)表示prop就是"0"、"1"、"2"等。

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

      for(let prop of props){
      

      Playground

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 2021-01-22
        • 2017-09-18
        • 2015-12-19
        • 2016-05-28
        • 2020-10-22
        • 2020-07-24
        • 1970-01-01
        • 2022-10-14
        相关资源
        最近更新 更多