2015-11-19 14 views
5

È possibile rilevare errori di battitura come nell'istruzione esempio switch case di seguito?Javascript import handle undefined

Il modo preferito sarebbe che eslinter segnala un avviso/errore. Attualmente l'aggiunta di toString() a const può essere utilizzata per aumentare un TypeError in fase di esecuzione se non definito.

actionTypes.js

export const UPDATE_REQUEST = 'UPDATE_REQUEST'; 

reducer.js

import * as types from '../constants/actionTypes'; 

export default function pouchdbReducer(state = {}, action) { 
    switch (action.type) { 
    case types.UPDDATE_REQUEST: 
     // there is a typo above and it evaluates to `undefined` 
     // this code would never be reached - how to make it an error 
     return Object.assign({}, state, {updated: true}); 
    default: 
     return state; 
    } 
} 

UPDATE:

Come @ nikc.org risposto eslint-plugin-import con namespace opzione può essere utilizzata per rilascio di fibre questi bug.

Qui è piccolo repository con la configurazione e la demo:

https://github.com/bmihelac/test-js-import-undefined/tree/eslint-plugin-import

parte rilevante del eslint config è:

"plugins": ["import"], 
"rules": { 
    "import/namespace": [2], 
+4

Bene, il problema con il tentativo di individuare errori del genere è che non sono necessariamente errori. Non c'è niente * errato * nel codice, in altre parole, date le regole di JavaScript. – Pointy

+0

@Pointy poiché i moduli es6 sono statici spero che alcuni analizzatori statici possano trovare errori di battitura come questo. – bmihelac

+0

Esatto, è probabile che un'analisi statica intelligente avverta almeno l'assenza della costante errata. – Pointy

risposta

0

Il plugin eslint-plugin-import per ESLint esegue l'analisi statica sul import s e export s e può essere configurato per generare errori o avvisi su diversi criteri, incluso il caso nella domanda in cui hai sbagliato a scrivere il refere a un simbolo importato.

Per eliminare completamente il problema, è possibile dare un'occhiata a Tern che fornisce informazioni sul codice e il completamento del codice in diversi editor evitando completamente errori di ortografia.

+1

@aschipfl In che modo non fornisce una risposta? Potrei tamponare la risposta con lanugine prosaico per riempirlo, se lo trovi troppo corto, ma non aggiungerebbe valore. La domanda era: "Puoi usare l'analisi statica per trovare riferimenti non validi ai simboli importati?". La mia risposta è: "Sì, puoi, ecco uno strumento che fa proprio questo". Come non è una risposta? –

+0

@ nikc.org - "namespace" è l'opzione di eslint-plugin-import che stavo cercando. – bmihelac

1

Disclaimer, sono l'autore di tern-lint.

Ti suggerisco di utilizzare tern-lint che è in grado di segnalare errori come "Proprietà sconosciuta".

È possibile utilizzare questo linter con il comando o con un editor che lo supporta (Emacs, Atom, CodeMirror o Eclipse). Ecco uno screenshot con Eclipse tern.java

enter image description here

+0

tern-lint sembra promettente, ma eslint-plugin-import sembra più semplice da usare – bmihelac

+0

@bmihelac potresti dirmi cosa è difficile con tern-lint, per favore. Usare tern-lint con il comando non è un bene comune, quindi per favore ditemi dei suggerimenti per migliorarlo, grazie! – Angelo

+0

come già uso eslint, la configurazione di eslint-plugin-import è stata molto semplice. Uso anche la terna, ma sfortunatamente non esiste un supporto out-of-box per l'editor di vim per tern-lint (è per questo che ho detto che è più semplice installare eslint-plugin-import). Inoltre ho scoperto che la terna può avere una risposta lenta e timeout per progetti più grandi che sicuramente miglioreranno nel tempo (suppongo che ci si possa aspettare anche da tern-lint). – bmihelac

0

suppongo a seconda del numero di tipi di azioni (e se siete disposti a rompere in su) si potrebbe un po 'cambiare come li si importa.

Forse qualcosa di simile:

import {TYPE_ONE, TYPE_TWO} from '../constants/firstActionTypes'; 
import {TYPE_THREE} from '../constants/secondActionTypes'; 

export default function pouchdbReducer(state = {}, action) { 
    switch (action.type) { 
    case TTYPE_ONE: 
     // Linting should identify this easily now 
     return Object.assign({}, state, {updated: true}); 
    default: 
     return state; 
    } 
} 

Linters tipico può raccogliere che fino abbastanza facilmente e un vantaggio collaterale è che si può rompere le vostre azioni a loro preoccupazioni.