520 votes

Comment supprimer "error TS2533 : Object is possibly 'null' or 'undefined'" ?

J'ai un type :

type tSelectProtected = {
  handleSelector?: string,
  data?: tSelectDataItem[],

  wrapperEle?: HTMLElement,
  inputEle?: HTMLElement,
  listEle?: HTMLElement,
  resultEle?: HTMLElement,

  maxVisibleListItems?: number
}

Je déclare une variable globale de type module :

var $protected : tSelectProtected = {};

J'attribue la valeur appropriée dans function1() l'étendue :

$protected.listEle = document.createElement('DIV');

Plus tard dans function2() scope, j'appelle :

$protected.listEle.classList.add('visible');

Je reçois une erreur TypeScript :

error TS2533: Object is possibly 'null' or 'undefined'

Je sais que je peux faire une vérification explicite en utilisant if ($protected.listEle) {$protected.listEle} pour calmer le compilateur mais cela semble être très peu pratique pour la plupart des cas non triviaux.

Comment cette situation peut-elle ou doit-elle être traitée sans désactiver les contrôles du compilateur TS ?

1124voto

Ryan Cavanaugh Points 17393

Si vous savez par des moyens externes qu'une expression n'est pas null o undefined vous pouvez utiliser l'opérateur d'assertion non nul. ! pour éloigner ces types :

// Error, some.expr may be null or undefined
let x = some.expr.thing;
// OK
let y = some.expr!.thing;

33 votes

Merci de m'avoir informé sur ! - Non-null assertion operator opérateur. Il semble que la chose ne soit pas encore bien documentée ( https://github.com/Microsoft/TypeScript/issues/11494 ) alors si vous cherchez des réponses, lisez ceci http://stackoverflow.com/questions/38874928/operator-in-typescript-après-méthode-objet

14 votes

Cela n'a également aucun effet pour moi sur tsc v2.7.2

0 votes

Merci, cela fait si longtemps que je cherche cela - je ne savais pas que cela existait en JavaScript. L'opérateur de vérification nul fonctionne de la même manière en C# mais c'est un ?

192voto

Douglas Points 10417

Cette fonctionnalité est appelée "contrôles stricts des nullités". Pour la désactiver, il faut s'assurer que l'adresse de l'utilisateur est la suivante --strictNullChecks n'est pas activé.

Cependant, l'existence de null a a été décrit comme L'erreur du milliard de dollars Il est donc intéressant de voir des langages tels que TypeScript introduire un correctif. Je recommande vivement de garder cette option activée.

Une façon de résoudre ce problème est de s'assurer que les valeurs ne sont jamais null o undefined par exemple en les initialisant dès le départ :

interface SelectProtected {
    readonly wrapperElement: HTMLDivElement;
    readonly inputElement: HTMLInputElement;
}

const selectProtected: SelectProtected = {
    wrapperElement: document.createElement("div"),
    inputElement: document.createElement("input")
};

Voir La réponse de Ryan Cavanaugh pour une option alternative, cependant !

9 votes

Personnellement, j'utilise null s dans le JavaScript "vanille" pour initialiser les valeurs des variables ou des propriétés. Cela me donne une réponse directe si une variable ou une propriété donnée existe mais qu'elle n'a pas encore de valeur utilisable ou que la valeur a été effacée à un moment donné de l'exécution. C'est juste par convention. Ce n'est peut-être pas la meilleure approche en TypeScript, comme je peux le voir dans les réponses ici. Merci pour vos réflexions.

59 votes

Même l'initialisation ne supprime pas "Object is possibly 'undefined'" pour moi dans TS 2.7.2.

1 votes

Oui, mais ces définitions changent les valeurs des objets, par exemple, HTMLDivElement n'a pas de cible la plus proche et d'autres événements et propriétés de base des éléments.

72voto

Mahesh Nepal Points 165

Cette solution a fonctionné pour moi :

  • aller à tsconfig.json et ajouter "strictNullChecks":false

enter image description here

1 votes

Cela a également fonctionné pour moi. Bien qu'il donne encore des erreurs comme, par exemple, dans les déclarations de souscription, il ne reconnaît pas la variable de résultat, typescript veut qu'il déclare .subscribe(result => this.result =result.json()) ;

0 votes

Avez-vous essayé d'utiliser l'opérateur 'map' ? Recherchez 'rxjs/map' sur Google. En gros, je fais :. Http.get(...).map(result => result.json()).subscribe(result=>{fais ton truc ici})

72 votes

Ne répond pas à la question. Le PO a explicitement dit : "sans désactiver les contrôles du compilateur TS".

59voto

JoshuaTree Points 368

Mise à jour : Chaînage d'objets est un moyen d'accéder aux propriétés d'une référence éventuellement nulle ou indéfinie.

object?.objectProperty?.nextProperty

Précédemment

if (object !== undefined) {
    // continue - error suppressed when used in this way.
}

Précédemment

const objectX = object as string

Toutefois, avant d'opter pour l'une des solutions ci-dessus, réfléchissez à l'architecture que vous visez et à son impact sur l'ensemble du projet.

101 votes

Pour une raison quelconque, mon TSC ignore l'instruction if, la considère toujours comme possiblement indéfinie...

18 votes

Mon erreur n'est PAS supprimée lorsque j'utilise if(object!==undefined) object.function();

0 votes

On peut aussi utiliser la double comparaison avec null y undefined et ce n'est pas une mauvaise pratique (seulement si vous utilisez ces deux types) - l'événement TSLint vous permettra de le faire. Il est plus facile de vérifier si quelque chose est défini car au lieu d'écrire null !== someObject && undefined !== someObject vous pouvez utiliser seulement null != someObject

19voto

ssube Points 8838

Si vous savez que le type ne sera jamais null o undefined vous devez le déclarer comme foo: Bar sans le ? . Déclarer un type avec l'option ? Bar signifie qu'il peut être indéfini, ce que vous devez vérifier.

En d'autres termes, le compilateur fait exactement ce que vous lui demandez. Si vous voulez qu'il soit optionnel, vous devrez le vérifier plus tard.

2 votes

"le compilateur fait exactement ce que vous lui demandez" donc mon idée est fausse, merci. Je dois changer un peu d'approche.

0 votes

Dans mon cas, le compilateur n'a tout simplement pas réalisé que j'avais déjà vérifié que l'objet n'était pas nul. J'ai un getter qui vérifie si l'objet est nul et j'appelle ce getter. Donc non, il ne fait pas exactement ce que je lui ai demandé (ce qui ne veut pas dire que j'attends de lui qu'il comprenne tout).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X