Je veux avoir une fonction qui retourne un tableau, mais je veux que le tableau retourné soit en lecture seule, donc je devrais recevoir un avertissement/erreur lorsque j'essaie de changer son contenu.
function getList(): readonly number[] {
return [1,2,3];
}
const list = getList();
list[2] = 5; // This should result in a compile error, the returned list should never be changed
Cela peut-il être réalisé dans TypeScript?
Cela semble fonctionner ...
function getList(): ReadonlyArray<number> {
return [1, 2, 3];
}
const list = getList();
list[0] = 3; // Index signature in type 'ReadonlyArray<number>' only permits reading.
Essayez-le dans le Playground
ReadonlyArray<T>
est implémenté comme ceci:
interface ReadonlyArray<T> {
readonly [n: number]: T;
// Rest of the interface removed for brevity.
}
Le code même d'OP fonctionne maintenant depuis TypeScript 3.4 a introduit une nouvelle syntaxe pour ReadonlyArray
:
Bien qu'il soit recommandé d'utiliser
ReadonlyArray
surArray
lorsqu'aucune mutation n'est prévue, cela a souvent été un problème étant donné que les tableaux ont une syntaxe plus agréable. Plus précisément,number[]
est une version abrégée deArray<number>
, tout commeDate[]
est un raccourci pourArray<Date>
.TypeScript 3.4 introduit une nouvelle syntaxe pour
ReadonlyArray
en utilisant un nouveau modificateurreadonly
pour les types de tableau.
Ce code fonctionne désormais comme prévu:
function getList(): readonly number[] {
return [1,2,3];
}
const list = getList();
list[2] = 5; // <-- error
Ce qui suit rendra la liste en lecture seule mais pas les éléments qu'elle contient:
function getList(): Readonly<number[]> {
return [1,2,3];
}
let list = getList();
list = 10; // error
list[1] = 5 // that is fine
Et celui-ci rendra la liste et les éléments de celle-ci en lecture seule:
function getList(): ReadonlyArray<number> {
return [1,2,3];
}
let list = getList();
list = 10; // error
list[1] = 5 // error as well
TypeScript a un ReadonlyArray<T>
type qui fait ceci:
TypeScript est livré avec un type ReadonlyArray identique à Array, toutes les méthodes de mutation étant supprimées, vous pouvez donc vous assurer de ne pas modifier vos tableaux après leur création.
function getList(): ReadonlyArray<number> {
return [1,2,3];
}
const list = getList();
list[2] = 5; // error
for (const n of list) {
console.log(n);
}