J'utilise actuellement Vue.js avec TypeScript dans un projet de webpack.
Comme indiqué dans le Configuration recommandée dans mon tsconfig.json
J'ai:
"strict": true,
À l'intérieur d'un de mes composants, j'ai:
declare interface Player {
cod: string,
param: string
}
export default Vue.extend({
name: 'basecomponent',
data() {
return {
players: []
};
},
created()
let self = this
axios.get('fetch-data')
.then((response) => {
let res: Players[] = response.data;
for(let i = 0; i < res.length; i++){
self.players.Push(res[i]);
}
})
.catch((error: string) => {
console.log(error);
});
},
});
mais quand j'essaye de compiler j'obtiens:
error TS2345: Argument of type 'Player' is not assignable to parameter of type 'never'.
Parce que je crois players: []
a never[]
type.
Ma question est: comment puis-je déduire le type Vue propriétés de l'objet de données ??
Pour ajouter à la réponse de Joshua, vous voudrez peut-être déclarer le type de joueurs en ligne afin que votre code ne devienne pas trop verbeux à mesure que vos données augmentent.
data() {
return {
players: [] as Player[]
};
},
une autre option:
data() {
return {
players: new Array<Player>()
};
},
Votre méthode data
a une valeur de retour non déclarée.
Si vous en fournissez un, TypeScript saura à quoi s'attendre avec players
.
Il vous suffit de développer la ligne data() {
.
par exemple.:
data() {
return {
players: []
};
},
doit devenir:
data() : {
people: Array<any>, // if possible, replace `any` with something more specific
} {
return {
players: []
};
},
Tada! joueurs est désormais de type Array de tout.
Cela devrait fonctionner:
declare interface Player {
cod: string,
param: string
}
declare interface BaseComponentData {
players: Player[]
}
export default Vue.extend({
name: 'basecomponent',
data(): BaseComponentData {
return {
players: []
};
},
})
L'affirmation de type utilisant la syntaxe '<>' est interdite. Utilisez plutôt la syntaxe 'as'.
Il ressemblera à ceci:
players: [] as Player[]