microsoft / microsoft/TypeScript
Design Meeting Notes, 2026-07-21
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
# Strict `nil` Checking
* Lots of issues you can see from the new codebase by searching the repo for "nil dereference".
* Tools exist for static analysis in Go like [nilaway](https://github.com/uber-go/nilaway)
* However, we ended up with over 1000 errors which seemed like too many to address.
* One of the issues with nilaway is that it doesn't have a way of encoding invariants in the type system.
* For example:
```go
func IsParenthesizedTypeNode(node *Node) bool {
return node.Kind == SyntaxKind.ParenthesizedType
}
func SkipTypeParentheses(node *Node) *Node {
for IsParenthesizedTypeNode(node) {
node = node.Type()
}
return node
}
// Acts as a helper to just grab the `Type` property
// from various node types.
func (n *Node) Type() *Node {
switch n.Kind {
case SyntaxKind.ParenthesizedType:
return n.AsParenthesizedType().Type
// ...
}
```
* In that example, nilaway complains that `node` may be nil in the call to `node.Type()`, but we know that it can't be because of the invariant established by `IsParenthesizedTypeNode`.
* Back in TypeScript, we would just grab the property `node.type` because `IsParenthesizedTypeNode` would have been a type guard that would narrow the type of `node` to `ParenthesizedTypeNode`.
* Now we have a virtual call and nilaway can't link whatever we've learned from the call to `IsParenthesizedTypeNode`.
* So @gabritto has been prototyping a linting pass that is able to encode much of the same information from TypeScript's control flow analysis and type guards over our Go codebase.
* *\[\[ Example of it catching issues like https://github.com/microsoft/typescript-go/issues/1948 ]]*
* Uses comment suffixes.
```go
// Type alias that is purely for documentation purposes.
type CallExpressionNode = Node //ref: struct { Kind KindCallExpression; data DefPtr[CallExpression] }
// DefCallExpressionNode is a non-nilable pointer to a CallExpressionNode.
type DefCallExpressionNode = *CallExpressionNode //ref: nonnil
// A type guard:
//ref: node is DefCallExpressionNode
func IsCallExpression(node DefNode) bool {
return node.Kind == SyntaxKind.CallExpression
}
// A union type!
type NodeWithText = Node //ref: IdentifierNode | NumberLiteralNode
type DefNodeWithText = *NodeWithText //ref: nonnil
```
* Could we try to make the default non-nilable?
* Would probably make a lot of stuff less-specially-annotated.
* Would we be doing this checking on *all* types or just some subset of ours?
* All right now.
* Does this work well given that these are just aliases in Go?
* Go is good at preserving type aliases.
* How does this system know that something is a "discriminated union"?
* It's similar to what we do in TypeScript.
* We basically look for specific literal values in a common property across the set of types.
* Basically the comment format uses Go syntax for structs along with new syntax for unions.
* Looks extremely promising so far.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Non vengono indicati file, test o punti di ingresso concreti. Inizia esaminando la discussione sul controllo rigoroso di nil e il formato del suffisso dei commenti del prototipo; il lavoro sarebbe considerato concluso quando saranno definiti l'ambito del passaggio di linting, i relativi valori predefiniti di nilability e la gestione dei type guard e delle unioni discriminate.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- go
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Tranquilla
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 30/100