TypeScript:与类型中的自己的属性相关

时间:2019-02-13 06:51:34

标签: typescript

假设我有一个对象:

const config = {
  initial: 'foo', // must be key of .states
  states: {
    foo: {},
    bar: {}
  }
}

如何创建类型定义,以便TypeScript可以断言config.initialconfig.states的键?例如,

type Config = {
  initial?: <key of .states>,
  states: {
    [K: string]: Config
  }
}

function createSomething(config: Config) {
  // ...
}

// should NOT compile
createSomething({
  initial: 'fake',
  states: {
    foo: { states: {} },
    bar: { states: {} }
  }
});

我的想法是我想要一个强类型的配置对象,该对象的属性在createSomething函数中相互依赖。这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在函数中描述限制

function createSomething<S, K extends keyof S>(c: { initial: K, states: S }): Config

...
// Type '"c"' is not assignable to type '"a" | "b"'.
// (property) initial: "a" | "b"
createSomething({ initial: 'c', states: { a: {}, b: {} } });