microsoft / microsoft/TypeScript
Reflect Metadata not supported for TC39 decorators
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
🔎 Search Terms
decorator, experimentalDecorators, emitDecoratorMetadata, TC39, reflect-metadata, Reflect.metadata(k, v)
🕗 Version & Regression Information
This breaks when setting disabling experimental decorators
"experimentalDecorators": false,
"emitDecoratorMetadata": false,
⏯ Playground Link
https://github.com/paulsmithkc/typescript-decorators
💻 Code
tsconfig.json
{
"compilerOptions": {
"target": "ES2021",
"module": "commonjs",
"outDir": "dist",
"declaration": true,
"experimentalDecorators": false,
"emitDecoratorMetadata": false
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
src/index.ts
import 'reflect-metadata';
function setting(defaultValue: string): any {
function getType(target: unknown, property: string | symbol) {
return Reflect.getMetadata('design:type', target, property);
}
function settingExperimental(target: unknown, property: string | symbol): void {
console.log('settingExperimental', { defaultValue, target, property, type: getType(target, property) });
target[property] = process.env[String(property)] || defaultValue;
return;
}
function settingTC39(_target: unknown, context: ClassFieldDecoratorContext): () => string {
return function (): string {
console.log('settingTC39', { defaultValue, target: this, context, type: getType(this, context.name) });
return process.env[String(context.name)] || defaultValue;
};
}
return function (target: unknown, context: string | symbol | ClassFieldDecoratorContext) {
if (typeof context !== 'object') {
return settingExperimental(target, context);
} else {
return settingTC39(target, context);
}
};
}
class Config {
@setting('default_1') SETTING_ONE: string;
}
const configInstance = new Config();
run with:
tsc --project tsconfig.json && node dist/index.js
🙁 Actual behavior
Reflect.getMetadata('design:type', target, property) returns undefined.
🙂 Expected behavior
Reflect.getMetadata('design:type', target, property) returns the type of the class field, when using Standard TC39 decorators.
Additional information about the issue
-
When transpiling with:
"experimentalDecorators": true, "emitDecoratorMetadata": true,The decorator
Reflect.metadata("design:type", type)is automatically applied to each class field. -
When transpiling with:
"experimentalDecorators": false, "emitDecoratorMetadata": false,The decorator
Reflect.metadata("design:type", type)is not applied. -
When transpiling with:
"experimentalDecorators": false, "emitDecoratorMetadata": true,Typescript produces the following error
Option 'emitDecoratorMetadata' cannot be specified without specifying option 'experimentalDecorators'.
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
Esegui tsc --project tsconfig.json && node dist/index.js dal playground collegato, quindi inizia da src/index.ts e dalle relative chiamate ai decorator insieme a tsconfig.json. Il lavoro è completato quando il percorso standard dei decorator TC39 restituisce il tipo del campo della classe tramite Reflect.getMetadata('design:type', ...) invece di undefined, senza modificare i vincoli sulle opzioni del compilatore riportati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100