ianstormtaylor/slate · error · Error
Cannot set the "then" property of the selection to a functio
Error message
Cannot set the "then" property of the selection to a function
What it means
Slate refuses to set a 'then' property on the selection when the value is a function, because a thenable selection would be treated as a Promise-like object. Returning such a selection from an async function would auto-await it and cause surprising behavior, so Slate guards against it explicitly.
Source
Thrown at packages/slate/src/interfaces/transforms/general.ts:328
}
const selection = { ...editor.selection }
for (const key in newProperties) {
if (NON_SETTABLE_SELECTION_PROPERTIES.includes(key)) {
throw new Error(
`Cannot set the "${key}" property of the selection!`
)
}
const value = newProperties[<keyof Range>key]
// Make sure we're not setting `then` to a function, since this will
// cause the selection to be treated as a Promise-like object, which
// can cause unexpected behaviour when returning the selection from
// async functions.
if (key === 'then' && typeof value === 'function') {
throw new Error(
'Cannot set the "then" property of the selection to a function'
)
}
if (value == null) {
if (key === 'anchor' || key === 'focus') {
throw new Error(`Cannot remove the "${key}" selection property`)
}
delete selection[<keyof Range>key]
} else {
selection[<keyof Range>key] = value
}
}
editor.selection = selection
breakView on GitHub (pinned to 72a37c701e)
Solutions
- Strip any 'then' key from selection properties before calling setSelection
- Validate that no property value in the operation is a function before applying remote ops
- If you need a custom selection key, rename it away from 'then'
Example fix
// before Transforms.setSelection(editor, propsWithThen as any) // after delete propsWithThen['then'] Transforms.setSelection(editor, propsWithThen as Partial<Range>)
Defensive patterns
Strategy: validation
Validate before calling
if ('then' in props && typeof props['then'] === 'function') {
throw new Error('then must not be a function on selection')
}
const { then, ...rest } = props as any
Transforms.setSelection(editor, rest) Type guard
const hasFunctionThen = (o: object): boolean => 'then' in o && typeof (o as any).then === 'function'
Prevention
- Never assign 'then' on selection objects
- Strip 'then' when deserializing/reviving remote data
- Reject ops containing function-valued properties
When it happens
Trigger: Transforms.setSelection(editor, { then: () => {} }) or applying a set_selection op whose properties include then: function; usually from deserialized/untrusted data where 'then' is a function value.
Common situations: Applying remote or localStorage-persisted operations that were not sanitized; JSON payloads where a key named 'then' resolved to a function via eval-like revival; prototype-pollution attempts.
Related errors
- Cannot set the "${key}" property of the selection!
- Cannot resolve a Slate range from a DOM event: ${event}
- Cannot resolve a DOM point from Slate point: ${Scrubber.stri
- Cannot resolve a Slate point from DOM point: ${domPoint}
- Cannot resolve a Slate range from DOM range: ${domRange}
AI-assisted analysis of ianstormtaylor/slate@72a37c701e (2026-08-27).
Data as JSON: /api/errors/4fc07a96e9a4f781.
Report an issue: GitHub.