Vous ne pouvez pas modifier le type d'une propriété existante.
Vous pouvez ajouter une propriété:
interface A {
newProperty: any;
}
Mais changer un type d'existant:
interface A {
property: any;
}
Entraîne une erreur:
Les déclarations de variables suivantes doivent avoir le même type. La variable 'propriété' doit être de type 'nombre', mais ici a le type 'any'
Vous pouvez bien sûr avoir votre propre interface qui étend une interface existante. Dans ce cas, vous pouvez remplacer un type uniquement par un type compatible, par exemple:
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
Au fait, vous devriez probablement éviter d'utiliser Object
comme type, utilisez plutôt le type any
.
Dans la documentation pour le any
type, il indique:
Le type any est un moyen puissant de travailler avec JavaScript existant, vous permettant d'activer et de désactiver progressivement la vérification de type lors de la compilation. Vous pouvez vous attendre à ce que Object joue un rôle similaire, comme il le fait dans d'autres langues. Mais les variables de type Object vous permettent uniquement de leur attribuer une valeur quelconque - vous ne pouvez pas appeler de méthodes arbitraires sur elles, même celles qui existent réellement :
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
J'utilise une méthode qui filtre d'abord les champs, puis les combine.
référence Exclure la propriété du type
pour l'interface:
la source
extend
fonctionne par défaut, mais hélas, celaOmit
corrige toutInspiré par la
extends Omit
solution de ZSkycat , j'ai proposé ceci:Exemple:
Aller étape par étape:
Types d'utilitaires TypeScript
la source
En étendant un peu la réponse de @ zSkycat, vous pouvez créer un générique qui accepte deux types d'objet et renvoie un type fusionné avec les membres du second remplaçant les membres du premier.
la source
Omit
la propriété lors de l'extension de l'interface:la source
C'est drôle que je passe la journée à étudier la possibilité de résoudre le même cas. J'ai trouvé qu'il n'était pas possible de faire de cette façon:
Cause Un module peut ne pas connaître tous les types disponibles dans votre application. Et c'est assez ennuyeux de tout porter de partout et de faire du code comme celui-ci.
Vous devez définir le type plus tard pour que la saisie semi-automatique fonctionne correctement.
Vous pouvez donc tricher un peu:
A laissé le type par défaut, qui autorise les travaux de saisie semi-automatique, lorsque les remplacements ne sont pas nécessaires.
ensuite
Désactivez l'exception stupide ici en utilisant le
@ts-ignore
drapeau, en nous disant que nous faisons quelque chose de mal. Et chose drôle, tout fonctionne comme prévu.Dans mon cas, je réduis la vision de la portée du type
x
, cela me permet de faire du code plus strict. Par exemple vous avez une liste de 100 propriétés, et vous la réduisez à 10, pour éviter les situations stupidesla source
Pour restreindre le type de propriété, les
extend
travaux simples sont parfaits, comme dans la réponse de Nitzan :Pour l' élargissement, ou en général remplaçant le type, vous pouvez faire la solution de Zskycat :
Mais, si votre interface
A
étend une interface générale, vous perdrez les types personnalisés deA
propriétés restantes lors de l'utilisationOmit
.par exemple
La raison est que, en
Omit
interne, ne passe que par lesExclude<keyof A, 'x'>
clés qui seront le généralstring | number
dans notre cas. Ainsi,B
deviendrait{x: number; }
et accepte toute propriété supplémentaire avec le type denumber | string | boolean
.Pour résoudre ce problème, j'ai proposé un
OverrideProps
type d'utilitaire différent comme suit:Exemple:
la source
Si quelqu'un d'autre a besoin d'un type d'utilitaire générique pour ce faire, j'ai proposé la solution suivante:
J'en avais besoin car dans mon cas, la clé à remplacer était un générique lui-même.
Si vous n'êtes pas
Omit
prêt, consultez Exclure la propriété du type .la source