【问题标题】:Restrict interface's property value to one of object's values将接口的属性值限制为对象的值之一
【发布时间】:2019-04-21 19:06:30
【问题描述】:

如果IExpression 接口类型的对象的expressions.null.propertyexpressions.video.property 值不是PROPERTIES 值之一,我希望TypeScript 引发错误。

我有这个对象:

const PROPERTIES =  {
    ANCHOR_POINT: 'anchorPoint',
    POSITION: 'position',
    X_POSITION: 'xPosition',
    Y_POSITION: 'yPosition',
    Z_POSITION: 'zPosition',
    SCALE: 'scale',
    ORIENTATION: 'orientation',
    ROTATION: 'rotation',
    X_ROTATION: 'xRotation',
    Y_ROTATION: 'yRotation',
    Z_ROTATION: 'zRotation',
    OPACITY: 'opacity',
};

我想将 IExpression.expressions.null.property 限制为 PROPERTIES 值之一。

这就是我试图让它发挥作用的方法:

type NULL_OR_VIDEO = "null" | "video";

interface IExpression {
    name: string;
    targets: FILE[];
    expressions: {
        [value in NULL_OR_VIDEO]: {
            property: PROPERTIES;
            expressionText: string;
        }
    }
}

虽然它会抛出错误。我知道我可以这样做:

interface IExpression {
    name: string;
    targets: FILE[];
    expressions: {
        [value in NULL_OR_VIDEO]: {
            property: 'rotation' | 'xRotation'| 'opacity' ...
            expressionText: string;
        }
    }
}

但我不想。

【问题讨论】:

    标签: typescript types interface


    【解决方案1】:

    我将PROPERTIES 转换为枚举:

    enum PROPERTIES  {
        ANCHOR_POINT = 'anchorPoint',
        POSITION = 'position',
        X_POSITION = 'xPosition',
        Y_POSITION = 'yPosition',
        Z_POSITION = 'zPosition',
        SCALE = 'scale',
        ORIENTATION = 'orientation',
        ROTATION = 'rotation',
        X_ROTATION = 'xRotation',
        Y_ROTATION = 'yRotation',
        Z_ROTATION = 'zRotation',
        OPACITY = 'opacity',
    };
    

    现在是这样工作的:

    interface IExpression {
        name: string;
        targets: FILE[];
        expressions: {
            [value in NULL_OR_VIDEO]?: {
                property: PROPERTIES;
                expressionText: string;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2023-03-11
      • 2018-07-14
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多