microsoft / microsoft/TypeScript
Way of specifying non-enumerable properties
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
Object assign is defined like below in TS:
interface ObjectConstructor {
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source The source object from which to copy properties.
*/
assign<T, U>(target: T, source: U): T & U;
}
Though from MDN it is only copying members that are enumerable:
The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object.
So if U above has non-enumerable members, TS will copy them anyway. This is slightly incorrect and unsafe.
One issue I recently ran into was
const selection = Object.assign({}, window.getSelection());
I was assuming I was copying all members of the Selection object to {}:
interface Selection {
readonly anchorNode: Node;
readonly anchorOffset: number;
// etc ...
}
declare var Selection: {
prototype: Selection;
new(): Selection;
}
Though it didn't copy any members at all, because the Selection object only contains non-enumerable members.
Proposal
Mark properties as non-enumerable
interface Selection {
readonly nonenum anchorNode: Node;
readonly nonenum anchorOffset: number;
// etc ...
}
And have an operator to get the only "enum side" of a type:
interface ObjectConstructor {
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source The source object from which to copy properties.
*/
assign<T, U>(target: T, source: U): T & enumsof U;
}
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
Inizia dalla dichiarazione di ObjectConstructor per Object.assign e dall’esempio di Selection, quindi confronta il marker nonenum e l’operatore enumsof proposti con il comportamento di JavaScript relativo alle proprietà proprie enumerabili. Il lavoro è completato quando il sistema dei tipi dispone di un modo concordato per rappresentare le proprietà enumerabili e Object.assign non sovrastima più i membri copiati, con copertura per il caso mostrato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 30/100