@@ -84,13 +84,17 @@ You can find a code snippet that shows how to specify a type for the ``FindCurso
8484class in the
8585:ref:`Find Multiple Documents Usage Example <node-driver-find-usage-example-code-snippet>`.
8686
87+ .. _node-ts-type-safety:
88+ 
8789Type Safety and Dot Notation
8890~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8991
90- If you specify a query or update with **dot notation**, the {+driver-short+}
91- provides type safety if your query or update does not
92- :ref:`reference a nested instance of a recursive type <node-driver-recursive-types-dot-notation>`.
93- Dot notation is a syntax you can use to navigate nested JSON objects.
92+ Starting in version 5.0, by default, the {+driver-short+} does not provide type
93+ safety for operations that search on fields expressed in **dot notation**. Dot
94+ notation is a syntax you can use to navigate nested JSON objects. When
95+ you construct a filter to pass to a query, the driver will not raise a
96+ type error even if you specify an incorrectly typed value for a field expressed
97+ in dot notation.
9498
9599The following code snippet defines the ``ClassificationPet`` interface,
96100which includes a ``classification`` field that enables you to specify the
@@ -104,22 +108,40 @@ genus and color of dogs and cats:
104108     classification: { genus: "Canis" | "Felis"; color: string };
105109   }
106110
107- The following code snippet correctly raises a type error when specifying
108- the genus of an unsupported animal in a query:
111+ The driver does not raise a type error for the following code sample,
112+ even though the value of ``classification.color`` is a boolean
113+ instead of a string:
109114
110115.. code-block:: typescript
111116
112-    database
113-      .collection<ClassificationPet>("<your collection>")
114-      .find({ "classification.genus": "Sylvilagus" });
117+    await collection.findOneAndDelete({ "classification.color": false })
118+ 
119+ You can enable type-checking by constructing filters as ``StrictFilter`` or
120+ ``StrictUpdateFilter`` types.
115121
116- The type error raised by the preceding code snippet is as follows:
122+ .. warning::
123+    
124+    The ``StrictFilter`` and ``StrictUpdateFilter`` types are experimental and
125+    may show type errors in valid queries where there should be none.
117126
118- .. code-block:: none
127+ In the following code sample, the filter is assigned a
128+ ``StrictFilter`` type. Given this filter type, the {+driver-short+}
129+ reports a type error because the value of ``classification.color`` is a
130+ boolean instead of a string.
131+ 
132+ .. code-block:: typescript
119133
120-    No overload matches this call.
121-    ...
122-    Type '"Sylvilagus"' is not assignable to type 'Condition<"Canis" | "Felis">'.
134+    const filterPredicate: StrictFilter<ClassificationPet> = { "classification.color": false };
135+    await collection.findOneAndDelete(filterPredicate);
136+ 
137+ The following example assigns a ``StrictUpdateFilter`` type to an update
138+ filter. The {+driver-short+} reports a type error because the value of
139+ ``classification.color`` is a boolean instead of a string.
140+ 
141+ .. code-block:: typescript
142+    
143+    const updateFilter: StrictUpdateFilter<ClassificationPet> = { $set: { "classification.color": false } }
144+    await pets.updateOne({}, updateFilter);
123145
124146Referencing Keys that Incorporate Variables
125147```````````````````````````````````````````
0 commit comments