繁体   English   中英

通过兄弟属性推断 object 类型 - Typescript

[英]Infer object types by sibling property - Typescript

是否可以根据同一 object 中的另一个属性断言 object 的属性?

但是如何根据type属性的values推断值的类型呢?

type StepKeys = "Test1" | "Test2";

interface objectMap {
    "Test1": {
        name: string
    },
    "Test2": {
        age: number
    }
};

interface Step<T extends StepKeys = StepKeys> {
    type: T;
    value: objectMap[T]
};

const steps: Record<string, Step> = {
    "Step1": {
        type: "Test1",
        value: {

        }
    }
}

这里values的类型是{ name: string; } | { age: number; } { name: string; } | { age: number; } { name: string; } | { age: number; }

是否可以推断出它的可能值?

Typescript

你好,如果你想有效地区分这个联合,类型参数不应该是一个联合,而是寻求将联合“推”到一种类型。 这是因为我们希望每个Step类型都有自己唯一的类型参数,而不是可能类型参数的联合。 所以一个小的改变,但完成你想要的。

const steps: Record<string, Step<'Test1'> | Step<'Test2'>> = {
    "Step1": {
        type: "Test1",
        value: {
            // infer ?
            age: 11,
// ^^^ correctly throws error 
// Object literal may only specify known properties, and 'age' does not exist in type '{ name: string; }'.(2322)
            name: 'test',
        }
    }
}

使用索引访问 map 类型,如果有更多的键/值对,您可以自动创建可区分的联合。

type Steps = Record<string, {
    [key in StepKeys]: Step<key>
}[StepKeys]>

在 TS 游乐场上查看

实现你想要的东西的唯一方法并不是很好,但它确实有效。 问题是你必须手动输入每个密钥(这使得它不可能通用或可扩展)。

interface PeoplePropsMap {
    withName: {
        name: string
    },

    withAge: {
        age: number
    }
};

type People =
    { type: 'withName', value: PeoplePropsMap['withName'] } |
    { type: 'withAge',  value: PeoplePropsMap['withAge']  }

const steps: Record<string, People> = {
    john: {
        type: 'withAge',
        value: {
            age: 10  
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM