javascript - Typescript streng til boolean
Jeg prøver å konvertere en streng til boolean. Det finnes flere måter å gjøre det på, en måte er
let input = "true";
let boolVar = (input === 'true');
Problemet her er at jeg må validere input for å se om det er sant eller falsk. I stedet for å validere første input og deretter gjøre konverteringen, finnes det en mer elegant måte? I .NET har vi bool.TryParse som returnerer false hvis strengen ikke er gyldig. Finnes det en tilsvarende i TypeScript?
Svar #1
Du kan gjøre noe som dette hvor du kan ha tre tilstander. undefined indikerer at strengen ikke kan tolkes som en boolsk verdi:
function convertToBoolean(input: string): boolean | undefined {
try {
return JSON.parse(input.toLowerCase());
}
catch (e) {
return undefined;
}
}
console.log(convertToBoolean("true")); // true
console.log(convertToBoolean("false")); // false
console.log(convertToBoolean("True")); // true
console.log(convertToBoolean("False")); // false
console.log(convertToBoolean("invalid")); // undefined
Svar #2
Returnerer true for 1, '1', true, 'true' (store og små bokstaver ignoreres). Ellers false
function primitiveToBoolean(value: string | number | boolean | null | undefined): boolean {
if (typeof value === 'string') {
return value.toLowerCase() === 'true' || !!+value; // here we parse to number first
}
return !!value;
}
Her er enhetstesten:
describe('primitiveToBoolean', () => {
it('should be true if its 1 / "1" or "true"', () => {
expect(primitiveToBoolean(1)).toBe(true);
expect(primitiveToBoolean('1')).toBe(true);
expect(primitiveToBoolean('true')).toBe(true);
});
it('should be false if its 0 / "0" or "false"', () => {
expect(primitiveToBoolean(0)).toBe(false);
expect(primitiveToBoolean('0')).toBe(false);
expect(primitiveToBoolean('false')).toBe(false);
});
it('should be false if its null or undefined', () => {
expect(primitiveToBoolean(null)).toBe(false);
expect(primitiveToBoolean(undefined)).toBe(false);
});
it('should pass through booleans - useful for undefined checks', () => {
expect(primitiveToBoolean(true)).toBe(true);
expect(primitiveToBoolean(false)).toBe(false);
});
it('should be case insensitive', () => {
expect(primitiveToBoolean('true')).toBe(true);
expect(primitiveToBoolean('True')).toBe(true);
expect(primitiveToBoolean('TRUE')).toBe(true);
});
});
TypeScript-oppskrift: Elegant parsing av Boolean (ref. til originalinnlegg)
