首页 > 解决方案 > 将接口的属性值限制为对象的值之一

问题描述

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

我有这个对象:

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;
        }
    }
}

但我不想。

标签: typescripttypesinterface

解决方案


我将其转换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;
        }
    }
}

推荐阅读