Ответ 1
Вы можете использовать этот трюк, который Typescript разрешает и который отлично работает в JavaScript:
foo(!!xxx);
В качестве альтернативы добавьте его в any
foo(<any>xxx);
В Typescript я могу это сделать:
var xxx : some_type;
if (xxx)
foo();
else
bar();
Здесь xxx будет рассматриваться как логическое, независимо от его типа.
Я хотел бы сделать то же самое в аргументе функции. У меня есть эта функция:
function foo(b : boolean) { ... }
Я хочу иметь возможность вызывать foo(xxx)
и иметь xxx как логическое, независимо от его типа. Но Typescript не допустит этого.
Я пробовал это:
foo(<boolean>xxx);
но что Typescript не позволит этого.
Я могу это сделать:
foo(xxx ? true : false);
Но это кажется немного глупым. Есть ли лучший способ сделать это?
Вы можете использовать этот трюк, который Typescript разрешает и который отлично работает в JavaScript:
foo(!!xxx);
В качестве альтернативы добавьте его в any
foo(<any>xxx);
Пока вы не можете набросить число непосредственно на логическое, вы можете отнести его в класс буфера Boolean и немедленно развернуть его. Например:
foo(<boolean><Boolean>xxx);
В то время как неуклюжий, он избегает стирания типа литья на <any>
. Это также, возможно, менее неясное и более читаемое, чем подход !!
(конечно же, в преобразованном js-коде).
С помощью TypeScript 2.0.2 вы можете сделать это:
type Falsey = '' | 0 | false | null | undefined;
function eatFruit(fruit: string | Falsey) {
if (fruit) {
alert(`Ate ${fruit}`);
} else {
alert('No fruit to eat!');
}
}
const fruits = ['apple', 'banana', 'pear'];
eatFruit(fruits[0]); // alerts 'Ate apple'
eatFruit(fruits[1]); // alerts 'Ate banana'
eatFruit(fruits[2]); // alerts 'Ate pear'
eatFruit(fruits[3]); // alerts 'No fruit to eat!'
const bestBeforeDay = 12;
let day = 11;
eatFruit(day < bestBeforeDay && 'peach'); // alerts 'Ate peach'
day += 1;
eatFruit(day < bestBeforeDay && 'peach'); // alerts 'No fruit to eat!'
let numMangos = 1;
eatFruit(numMangos && 'mango'); // alerts 'Ate Mango'
numMangos -= 1;
eatFruit(numMangos && 'mango'); // alerts 'No fruit to eat!'
foo(!!xxx); // This is the common way of coercing variable to booleans.
// Or less pretty
foo(xxx && true); // Same as foo(xxx || false)
Тем не менее, вы, вероятно, столкнетесь с дублированием двойного взрыва каждый раз, когда вы вызываете foo
в свой код, поэтому лучшим решением является перемещение транзакции в boolean внутри функции DRY
foo(xxx);
foo(b: any){
const _b = !!b;
// Do foo with _b ...
}
/*** OR ***/
foo(b: any){
if(b){
// Do foo ...
}
}
Вот мое решение:
const a: string = 'false';
const isAdd: boolean = new Boolean(a).valueOf();
if(isAdd) {
// do something
}
Использовать этот
YourMethod(!!isEnabled);
'!!' используется для приведения типа к логическому
if (xxx) {...}//читается как ИСТИНА, если xxx НЕ является неопределенным, или равно нулю if (! xxx) {...}//читается как ИСТИНА, если xxx НЕ является неопределенным или равно нулю
Для строки типа 'true' или 'false': xxx.toLowerCase(). Trim() === 'true'? правда: ложь
так:
var zzz = 'true'; //string
var yyy = []; //array
...
if(zzz.toLowerCase().trim() === 'true') { ... } // quick string conversion
...
if(yyy ? true : false) { ... } // quick any conversion - it TRUE if it not null or undefined
...
// in a catch-all function
if(toBoolean(zzz)) { ... }
if(toBoolean(yyy)) { ... }
toBoolean(xxx: any): boolean {
if(xxx) {
const xStr = xxx.toString().toLowerCase().trim();
if(xStr === 'true' || x === 'false') {
return xStr === 'true' ? true : false;
} else {
return xxx ? true : false;
}
} else {
return false;
}
}