@@ -36,7 +36,14 @@ fn validate_typed_dict_class_body(context: &InferContext<'_, '_>, class_node: &a
3636 // may also contain a docstring or pass statements (primarily to allow the creation
3737 // of an empty `TypedDict`). No other statements are allowed, and type checkers
3838 // should report an error if any are present.
39- for stmt in & class_node. body {
39+ validate_typed_dict_class_body_statements ( context, & class_node. body ) ;
40+ }
41+
42+ fn validate_typed_dict_class_body_statements (
43+ context : & InferContext < ' _ , ' _ > ,
44+ statements : & [ ast:: Stmt ] ,
45+ ) {
46+ for stmt in statements {
4047 match stmt {
4148 // Annotated assignments are allowed (that's the whole point), but they're
4249 // not allowed to have a value.
@@ -52,6 +59,14 @@ fn validate_typed_dict_class_body(context: &InferContext<'_, '_>, class_node: &a
5259 }
5360 // Pass statements are allowed.
5461 ast:: Stmt :: Pass ( _) => continue ,
62+ // If statements are allowed; the body statements must validate.
63+ ast:: Stmt :: If ( if_stmt) => {
64+ validate_typed_dict_class_body_statements ( context, & if_stmt. body ) ;
65+ for elif_else_clause in & if_stmt. elif_else_clauses {
66+ validate_typed_dict_class_body_statements ( context, & elif_else_clause. body ) ;
67+ }
68+ continue ;
69+ }
5570 ast:: Stmt :: Expr ( expr) => {
5671 // Docstrings are allowed.
5772 if matches ! ( * expr. value, ast:: Expr :: StringLiteral ( _) ) {
0 commit comments