#64251·TypeScript

Object with all context-sensitive properties requires at least one non-context-sensitive property for inference to work

Author: devanshjCreated Sep 12, 2026Updated Sep 16, 2026
LabelsPossible Improvement

Search Terms

object with all context-sensitive properties, self referencial types, xstate

Version & Regression Information

Tested with TypeScript 7.0.2, the issue exists even in versions as old as 4.4.4

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=6.0.3#code/PTAEAcCcHsCMBsCmBbAXKAJtRBnAdgOQAuoAlngGaKSgAioAxtJJIg0fAJ4A0j0eRRAA8SAQzwZQOIqMGhRreXk4AoBq1mIAsqIYALcogAUAbxWgyeUkVKj46AESiH3c3wHCi6E6ArRo6ACMoAC+rhbSmjjebhaiMRaJoIgCkJzoRkweIryRggCUoAC8AHygZklJWYIisZUgoAB6APx1SXmIbYkNLV0hdf0W-SH5KioNONDwAK42-OiiGJKioNM4iEg4OKB4-AC01Z5763g41qQAbogQMODURJygAAYA+uh40-DwT6BqGoI6fSGUxucjnOyOZzhdw1LzlXz+IKhaEdaLlOrxdGVZKpdKgTL8WG5GQFYplCrYmGeLoWHqtSlSEmdBl0vrQpJvHafeADNzDUYqDBseAKa5ZaSMf7aXQGPCIVBuAA89E8KQw2wpFjBNghoAA1ohONAKHQANoOVEOAC67KpInQcAAVmwiLbUQlKqaAMqWfWG41mi1MnDWq0e7EpIhpZoZQ72wNxojW4madBewqlUAXaCkDC2jkxrlfPq8oYlOpGIUUbWkeagACSQoE1k4AHlYM72MqShny9jaGMHncG02bA9FQAVMpFNwT5IiNXbcSqJLNfGgOeqiTbIwAOn3mLlV0gvdWeD1uwA7nhQGu5wqGZuF9vQE6XbeR5GW+3O0RJ2UH0pCculGJJ3kQY9B04YdGy-B4fxdf9ijcHxTQAaV9A0jRNCcw0-ZtxwndCrTKfogAOfEUiAA

Code

// problem: doesn't infer D correctly, context and state are any
createMachine({
  initial: "a",
  context: { foo: 1 },
  states: {
    a: {
      entry: (context, state) => {
        context
        // ^? any
        state
        // ^? any
      }
    }
  }
})

// solution: add a useless non-context-sensitive property `_: null` 
createMachine({
  initial: "a",
  context: { foo: 1 },
  states: {
    a: {
      entry: (context, state) => {
        context
        // ^? { foo: number }
        state
        // ^? "a"
      },
      _: null
    }
  }
})

declare const createMachine:
  <D extends {
    initial: keyof D["states"],
    context: object,
    states: {
      [S in keyof D["states"]]: {
        entry?: (context: D["context"], state: S) => void,
        _?: null
      }
    }
  }>
    (definition: IdentityObject<D>) =>
      D

type Identity<T> =
  T extends any
    ? ( T extends (...a: never) => unknown ? T :
        T extends object ? IdentityObject<T> :
        T
      )
    : never

type IdentityObject<T> =
  { [K in keyof T]: Identity<T[K]> }

Actual behavior

The first createMachine invocation doesn't infer the type parameter correctly (it requires at least one non-context-sensitive property) and hence context and state parameters of entry are not inferred.

Expected behavior

The first createMachine invocation should infer the type parameter correctly without having to pass in a non-context-sensitive property leading to inference of context and state parameters of entry

Additional information about the issue

The premise is adding (or rather not adding) an extra useless property shouldn't make a difference to the inference