@@ -83,7 +83,6 @@ CAPITALIZED_NAME = "Name"
8383
8484# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "Name" - did you mean "name"?"
8585# error: [missing-typed-dict-key] "Missing required key 'name' in TypedDict `Person` constructor"
86- # error: [invalid-assignment]
8786dave: Person = {CAPITALIZED_NAME : " Dave" , " age" : 20 }
8887
8988def age () -> Literal[" age" ] | None :
@@ -96,7 +95,6 @@ The construction of a `TypedDict` is checked for type correctness:
9695
9796``` py
9897# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`"
99- # error: [invalid-assignment]
10098eve1a: Person = {" name" : b " Eve" , " age" : None }
10199
102100# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`"
@@ -106,7 +104,6 @@ reveal_type(eve1a) # revealed: Person
106104reveal_type(eve1b) # revealed: Person
107105
108106# error: [missing-typed-dict-key] "Missing required key 'name' in TypedDict `Person` constructor"
109- # error: [invalid-assignment]
110107eve2a: Person = {" age" : 22 }
111108
112109# error: [missing-typed-dict-key] "Missing required key 'name' in TypedDict `Person` constructor"
@@ -116,7 +113,6 @@ reveal_type(eve2a) # revealed: Person
116113reveal_type(eve2b) # revealed: Person
117114
118115# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
119- # error: [invalid-assignment]
120116eve3a: Person = {" name" : " Eve" , " age" : 25 , " extra" : True }
121117
122118# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
@@ -205,8 +201,6 @@ reveal_type(alice["inner"]["age"]) # revealed: int | None
205201reveal_type(alice[" inner" ][" non_existing" ]) # revealed: Unknown
206202
207203# error: [invalid-key] "Invalid key for TypedDict `Inner`: Unknown key "extra""
208- # error: [invalid-argument-type]
209- # error: [invalid-assignment]
210204alice: Person = {" inner" : {" name" : " Alice" , " age" : 30 , " extra" : 1 }}
211205```
212206
@@ -243,7 +237,6 @@ All of these are missing the required `age` field:
243237
244238``` py
245239# error: [missing-typed-dict-key] "Missing required key 'age' in TypedDict `Person` constructor"
246- # error: [invalid-assignment]
247240alice2: Person = {" name" : " Alice" }
248241
249242# error: [missing-typed-dict-key] "Missing required key 'age' in TypedDict `Person` constructor"
@@ -262,15 +255,13 @@ house.owner = {"name": "Alice"}
262255
263256a_person: Person
264257# error: [missing-typed-dict-key] "Missing required key 'age' in TypedDict `Person` constructor"
265- # error: [invalid-assignment]
266258a_person = {" name" : " Alice" }
267259```
268260
269261All of these have an invalid type for the ` name ` field:
270262
271263``` py
272264# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`: value of type `None`"
273- # error: [invalid-assignment]
274265alice3: Person = {" name" : None , " age" : 30 }
275266
276267# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`: value of type `None`"
@@ -289,19 +280,16 @@ house.owner = {"name": None, "age": 30}
289280
290281a_person: Person
291282# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`: value of type `None`"
292- # error: [invalid-assignment]
293283a_person = {" name" : None , " age" : 30 }
294284
295285# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Person`: value of type `None`"
296- # error: [invalid-assignment]
297286(a_person := {" name" : None , " age" : 30 })
298287```
299288
300289All of these have an extra field that is not defined in the ` TypedDict ` :
301290
302291``` py
303292# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
304- # error: [invalid-assignment]
305293alice4: Person = {" name" : " Alice" , " age" : 30 , " extra" : True }
306294
307295# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
@@ -320,11 +308,9 @@ house.owner = {"name": "Alice", "age": 30, "extra": True}
320308
321309a_person: Person
322310# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
323- # error: [invalid-assignment]
324311a_person = {" name" : " Alice" , " age" : 30 , " extra" : True }
325312
326313# error: [invalid-key] "Invalid key for TypedDict `Person`: Unknown key "extra""
327- # error: [invalid-assignment]
328314(a_person := {" name" : " Alice" , " age" : 30 , " extra" : True })
329315```
330316
@@ -520,6 +506,15 @@ dangerous(alice)
520506reveal_type(alice[" name" ]) # revealed: str
521507```
522508
509+ Likewise, ` dict ` s are not assignable to typed dictionaries:
510+
511+ ``` py
512+ alice: dict[str , str ] = {" name" : " Alice" }
513+
514+ # error: [invalid-assignment] "Object of type `dict[str, str]` is not assignable to `Person`"
515+ alice: Person = alice
516+ ```
517+
523518## Key-based access
524519
525520### Reading
@@ -790,7 +785,6 @@ class Employee(Person):
790785alice: Employee = {" name" : " Alice" , " employee_id" : 1 }
791786
792787# error: [missing-typed-dict-key] "Missing required key 'employee_id' in TypedDict `Employee` constructor"
793- # error: [invalid-assignment]
794788eve: Employee = {" name" : " Eve" }
795789
796790def combine (p : Person, e : Employee):
@@ -892,7 +886,6 @@ p1: TaggedData[int] = {"data": 42, "tag": "number"}
892886p2: TaggedData[str ] = {" data" : " Hello" , " tag" : " text" }
893887
894888# error: [invalid-argument-type] "Invalid argument to key "data" with declared type `int` on TypedDict `TaggedData`: value of type `Literal["not a number"]`"
895- # error: [invalid-assignment]
896889p3: TaggedData[int ] = {" data" : " not a number" , " tag" : " number" }
897890
898891class Items (TypedDict , Generic[T]):
@@ -926,7 +919,6 @@ p1: TaggedData[int] = {"data": 42, "tag": "number"}
926919p2: TaggedData[str ] = {" data" : " Hello" , " tag" : " text" }
927920
928921# error: [invalid-argument-type] "Invalid argument to key "data" with declared type `int` on TypedDict `TaggedData`: value of type `Literal["not a number"]`"
929- # error: [invalid-assignment]
930922p3: TaggedData[int ] = {" data" : " not a number" , " tag" : " number" }
931923
932924class Items[T](TypedDict):
@@ -961,9 +953,6 @@ grandchild: Node = {"name": "grandchild", "parent": child}
961953nested: Node = {" name" : " n1" , " parent" : {" name" : " n2" , " parent" : {" name" : " n3" , " parent" : None }}}
962954
963955# error: [invalid-argument-type] "Invalid argument to key "name" with declared type `str` on TypedDict `Node`: value of type `Literal[3]`"
964- # error: [invalid-assignment]
965- # error: [invalid-argument-type]
966- # error: [invalid-argument-type]
967956nested_invalid: Node = {" name" : " n1" , " parent" : {" name" : " n2" , " parent" : {" name" : 3 , " parent" : None }}}
968957```
969958
@@ -1066,7 +1055,6 @@ def write_to_non_literal_string_key(person: Person, str_key: str):
10661055
10671056def create_with_invalid_string_key ():
10681057 # error: [invalid-key]
1069- # error: [invalid-assignment]
10701058 alice: Person = {" name" : " Alice" , " age" : 30 , " unknown" : " Foo" }
10711059
10721060 # error: [invalid-key]
0 commit comments