Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Wrong TypeScript type used for fields when name collision exists between imported and nested messages

Aperta
#3,025 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
node.js, typescript
Ambito
tooling

Direzione di ricerca

Inizia eseguendo il comando proto-loader-gen-types segnalato con common.proto e service.proto, quindi esamina il example/Service.ts generato. Segui il modo in cui il generatore risolve Resource quando il messaggio annidato ha lo stesso nome e verifica che il campo generato utilizzi il tipo importato e includa il relativo import.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

package: @grpc/proto-loader
Problem description

proto-loader-gen-types fails to disambiguate between imported top-level types and nested messages with the same name. When this collision occurs, it incorrectly uses the nested type, omits the required import, and generates types that don't match the protobuf structure. This causes type errors and breaks IDE autocomplete for affected fields.

Reproduction steps

Command:

npx proto-loader-gen-types --longs=String --enums=String --defaults --oneofs -I . --outDir=. common.proto service.proto

common.proto:

syntax = "proto3";
package example;

message Resource {
    int64 id = 1;
    string name = 2;
}

service.proto:

syntax = "proto3";
package example;
import "common.proto";

message Service {
    Resource resource = 1;  // Should reference Resource from common.proto
    
    message Status {
        message Metric {
            message Resource {  // Name collision
                string name = 1;
                int32 value = 2;
            }
        }
    }
}

Expected:

// example/Service.ts
import type { Resource as _example_Resource } from './Resource';

export interface Service {
  resource?: _example_Resource | null;  // Uses imported type
}

Actual:

// example/Service.ts
// Missing import for Resource

export interface Service {
  resource?: _example_Service_Status_Metric_Resource | null;  // Uses wrong nested type
}

Workaround - Manually add the import and fix the type:

import type { Resource as _example_Resource } from './Resource';

export interface Service {
  resource?: _example_Resource | null;  // Fixed
}
Environment

Reproduced with @grpc/[email protected] and @grpc/[email protected] on Ubuntu 22.04 on WSL2 (x86_64) with multiple 16+ Node versions. Node is installed using nvm

Additional context

Python and Go generators seem to handle this correctly:

# Python (protoc)
from example import common_pb2 as _common_pb2
class Service(_message.Message):
    resource: _common_pb2.Resource  # Correct
// Go (protoc-gen-go)
type Service struct {
    Resource *Resource  // Correct
}
// TypeScript (proto-loader-gen-types)
resource?: _example_Service_Status_Metric_Resource | null;  // Wrong
Lingua principale
TypeScript
Stelle
4.8k
Fork
716
Merge medio
1g 18h
PR unite (30g)
17

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di grpc/grpc-node

Tutte le issue di grpc/grpc-node

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.