docs: warn about Date coercion in CRUD callback inputs#649
Open
MMMikeM wants to merge 1 commit into
Open
Conversation
clone()'s JSON reviver silently converts ISO 8601 strings to Date objects on fields named by fieldUpdatedAt/fieldCreatedAt, but the callback parameter types still reflect the original declared type.
Author
Reproduction: runtime Date coercion in CRUD callbackstest('fieldUpdatedAt field is Date at runtime despite string typing', async () => {
let receivedInput: any;
const obs = observable(
syncedCrud({
initial: { a: { id: 'a', updatedAt: '2024-01-01T00:00:00.000Z' } },
fieldUpdatedAt: 'updatedAt',
update: async (input) => { receivedInput = input; },
}),
);
await promiseTimeout(1);
obs.a.set({ id: 'a', updatedAt: '2025-01-01T00:00:00.000Z' });
await promiseTimeout(1);
// TS says input.updatedAt is `string`, but clone()'s JSON reviver converts it
expect(receivedInput.updatedAt).toBeInstanceOf(Date);
});This passes — confirming the type/runtime mismatch the JSDoc warns about. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
create,update, anddeleteonSyncedCrudPropsBasewarning that fields named byfieldUpdatedAt/fieldCreatedAtwill beDateat runtime, not the declared typeclone()uses a JSON reviver that converts ISO 8601 strings toDateobjects. WhenfieldUpdatedAtorfieldCreatedAtis set, the corresponding fields on the callbackinputparameter areDateat runtime — but the TypeScript types still reflect the original declared type (e.g.stringornumber). This can cause silent failures when passing those values to APIs that expect strings.The JSDoc surfaces this in the IDE on hover so consumers are aware of the mismatch.
Test plan