Es gibt ein bisschen mittleren Boden, den Sie damit mit Flow schlagen können. Ja, Sie müssen am Ende eine Laufzeitprüfung durchführen, aber Sie können einen undurchsichtigen Typ erstellen, mit dem Flow erzwingen kann, dass Sie diese Validierungsfunktionen nicht umgehen können. Zuerst wird in einer Datei, diese setzen:
// @flow
// Define `Int` as an opaque type. Internally, it's just a number.
// It's opaque because only this module can produce values of
// this kind, so in order to obtain an "Int", one _must_ use one of
// these functions, which (at runtime) will guarantee that these
// will always be integers.
export opaque type Int = number;
// Here's a function that will convert any number to an Int by running
// a typecheck at runtime and perhaps change the value (by rounding)
// This is the ONLY way of obtaining a value of the type Int
export function int(n: number): Int {
if (!Number.isFinite(n)) {
throw new Error('Not a (finite) number');
}
// Round any real numbers to their nearest int
return Math.round(n);
}
// In your private functions, you can now require Int inputs
export function isPrime(n: Int): boolean {
// In here, you can assume the value of `n` is guaranteed to be an Integer number
for (let i = 2; i < Math.sqrt(n); i++) {
if (n % i === 0) return false;
}
return true;
}
Dann verwenden Sie die wie so:
// @flow
import { int, isPrime } from './lib';
isPrime(int(NaN)); // ok, but a runtime error, because NaN is not a number!
isPrime(int(3.14)); // ok, will effectively become isPrime(3)
isPrime(3.14); // Flow error!
Benutzer einen regulären Ausdruck '[0-9] +'. Sie können auch 'typeof' oder' isNaN() ' – vaso123
@lolka_bolka verwenden. Können Sie ein Beispiel mit dem regulären Ausdruck angeben? (Ich würde mich lieber nicht auf native typeof verlassen, von der bekannt ist, dass sie fehlerhaft ist.) –
vielleicht http://stackoverflow.com/questions/4724555/how-do-i-check-if-a-number-evaluates-to -infinity – maioman