Se TypeScript è un superset di JavaScript rigido, perché la notazione dei punti su un oggetto arbitrario è errata? Ho il codice JS che voglio convertire su TS per una migliore sicurezza del tipo, ma tutti gli accessi tramite notazione a punti (ad esempio, myObj.thing
) mi danno l'errore Property 'thing' does not exist on type '{}'.
. Funziona correttamente quando uso la notazione della parentesi (ad esempio, myObj['thing']
).Accesso agli oggetti TypeScript e dot-notation
risposta
x
non detiene alcuna proprietà denominata bar
quindi è necessario crearlo all'interno dell'oggetto:
function foobar() {
var x = {
foo: 'foo',
bar: 'bar'
}
return x;
}
alert(foobar().bar); //returns bar
È [apparentemente legale JS] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects) da assegnare a una proprietà che non esiste ancora in un oggetto, quindi sembra strano che io non possa farlo in TS senza un cast per 'any' (come @Asad descrive sopra). – user655321
Imparare qualcosa di nuovo ogni giorno ... Più modi diversi per dare una pelle a un gatto, credo. – mwilson
mwilson arrivati prima ho potuto! ;)
Nel codice sopra, Typescript non è in grado di determinare che l'oggetto x
esponga una proprietà denominata bar
, quindi non può risolverlo durante la visualizzazione di Intellisense.
Invece, aggiungere foo
, bar
, ecc come proprietà dell'oggetto in sé:
var x = {
foo: "FOO",
bar: "BAR"
};
Poi, quando si utilizza il Typescript Playground, sarete vedere il lavoro Intellisense come previsto:
HTH
so che dire che questo è strano, ma questo è uno o f i motivi principali per cui esiste TypeScript. Questo errore aiuta a prevenire l'impostazione accidentale o il recupero di proprietà inesistenti su un oggetto.
In questo momento, come il compilatore che si sta dicendo, la proprietà bar
non esiste su x
perché è stato implicitamente digitato per {}
durante la scrittura var x = {};
.
Si può dire al compilatore che x
ha più di zero proprietà definendo in modo esplicito il tipo:
var x: { foo?: string; bar?: string; } = {};
Ora è possibile ottenere o impostare x.foo
e x.bar
senza il compilatore lamentarsi. Nella maggior parte dei casi, si potrebbe spostare questo in un'interfaccia in questo modo:
interface IFooBar {
foo?: string;
bar?: string;
}
var x: IFooBar = {};
x.foo = "asdf"; // ok
x.test = "asdf"; // error, as it should be
Alcune persone stanno suggerendo che lanci a any
, ma non ottenere pigro. Si dovrebbe fare pieno uso del sistema di tipi fornito da TypeScript. In questo modo ti farai sicuramente risparmiare tempo mentre mantieni un'applicazione.
A causa della natura fortemente tipizzato di Carattere tipografico oggetto, è possibile utilizzare "qualsiasi" per farlo senza tipo:
var x: any = {};
x.bar = "bar"; /// ok
Se quello di cui hai bisogno è di definire il tipo di proprietà letterali
var x: { [index: string]: TypeA } = {};
quindi x["bar"]
ora può essere solo istanza di tipo A.
Personalmente preferisco specificare i tipi ogni volta che ne ho la possibilità.
Nota, è possibile creare un'istanza di questa variabile solo con {}
se si definiscono i campi come facoltativi con l'operatore ?:
.
let x: {foo?: string, bar?: string} = {};
x.foo = 'foo';
x.bar = 'bar';
Come altri hanno detto, se si prevede di utilizzare questo tipo più volte, probabilmente è meglio fare una classe esplicitamente per esso.
PS: è preferibile utilizzare let
anziché var
durante la programmazione in dattiloscritto. (Per esempio la portata di una dichiarazione var
è un po 'eccentrico, rispetto ad un let
che fa quello che ci si aspetta che faccia.)
- 1. javascript prestazioni accesso agli oggetti
- 2. Accesso agli oggetti di altre classi
- 3. Accesso agli oggetti da un altro processo
- 4. Accesso agli oggetti di tipo C#
- 5. Javascript livello principale nidificato accesso agli oggetti
- 6. Accesso agli oggetti in NSMutableDictionary per indice
- 7. Accesso sicuro agli oggetti nidificati Javascript
- 8. Accesso agli oggetti non numerici Proprietà per indice?
- 9. C# Accesso agli oggetti di gestione in ManagementObjectCollection
- 10. Accesso agli oggetti richiesta Hunchentoot dal REPL per il debug
- 11. Accesso agli elementi JSON
- 12. R e programmazione orientata agli oggetti
- 13. Reactjs - Orientato agli oggetti?
- 14. xmlNodo agli oggetti
- 15. Stranalità con accesso agli appunti
- 16. Programmazione orientata agli oggetti
- 17. Come riscrivere il codice per evitare TSLint "accesso agli oggetti tramite stringhe letterali"
- 18. Laravel: interrogazione e accesso agli oggetti figlio nella relazione nidificata con clausole where
- 19. L'indicizzatore TypeScript continua a ricevere errori tslint "l'accesso agli oggetti tramite stringhe letterali non è consentito"
- 20. Accesso agli elementi in coo_matrix
- 21. MongoDB è orientato agli oggetti?
- 22. Esperimento: C orientato agli oggetti?
- 23. Vettori di riferimenti agli oggetti
- 24. Puntatori agli oggetti allocati staticamente
- 25. programmazione orientata agli oggetti Android
- 26. Django accesso modello ForeignKey oggetti
- 27. unire due matrici di oggetti con Angular 2 e TypeScript?
- 28. Metodi di accesso dinamici della classe TypeScript
- 29. Typescript: accesso all'ultimo elemento di un array
- 30. Accesso agli attributi di sessione e conversione in int?
Questo è un avvertimento, si deve ancora compilare, in modo da dattiloscritto è ancora un superset rigorosa di JS. Il motivo per cui ti avverte è che TypeScript è stato digitato, e il tipo di 'x' non specifica le proprietà' bar'. Puoi lanciare su 'any', applicare un'interfaccia che abbia' bar', o usare '[" bar "]'. –
@Asad: l'errore mostrato e descritto viene segnalato come errore vero e proprio, non come avviso, e la mia build non riesce. Tuttavia, sono in grado di trasmettere a 'any' con successo. – user655321
TypeScript è intenzionalmente più rigido di JavaScript, quindi avere JavaScript in JavaScript non significa necessariamente che il compilatore TypeScript sarà d'accordo. –