2016-08-26 3 views
0

Если у меня есть массив союза я могу проверить TYPEOF значение таким образом:Машинопись - TypeOf массив типов профсоюзных

//case 1 
function something1(a1: Array<number | string | boolean>) 
{ 
    for (const v of a1) 
     if (typeof v === "number") 
      v; //v is number 
     else if (typeof v === "boolean") 
      v; //v is boolean 
     else 
      v; //v is string 
} 

Если у меня есть объединение массива я мог бы сделать это таким же образом:

//case 2 
function something2(a1: Array<number> | Array<string> | Array<boolean>) 
{ 
    for (const v of a1) 
     if (typeof v === "number") 
      v; //v is number 
     else if (typeof v === "boolean") 
      v; //v is boolean 
     else 
      v; //v is string 
} 

, но я хочу, чтобы избежать проверки типа внутри цикла:

//case 3 
function something3(a1: Array<number> | Array<string> | Array<boolean>) 
{ 
    if (a1.length === 0) 
     return; 
    if (typeof a1[0] === "number") 
     a1; //should be number[]!!  but it is number[] | string[] | boolean[] 
    if (typeof a1[0] === "boolean") 
     a1; //should be boolean[]!! but it is number[] | string[] | boolean[] 
    if (typeof a1[0] === "string") 
     a1; //should be string[]!!  but it is number[] | string[] | boolean[] 
} 

но a1 не распознается как число [] или строки [] или логическое значение [] ,
Но это имеет смысл. Поскольку все элементы массива имеют один и тот же тип. Можно ли это достичь?

Я использую бета-версию TypeScript 2.0.

ответ

3

С type guards:

function something3(a1: Array<number> | Array<string> | Array<boolean>) { 
    if (a1.length === 0) 
     return; 
    if (isArrayOfNumbers(a1)) 
     a1[0].toExponential(); 
    if (isArrayOfBooleans(a1)) 
     a1[0].valueOf(); 
    if (isArrayOfStrings(a1)) 
     a1[0].indexOf('abc'); 
} 

function isArrayOfNumbers(arr: number[] | string[] | boolean[]) : arr is number[] { 
    return arr.length > 0 && typeof arr[0] === 'number'; 
} 

function isArrayOfBooleans(arr: number[] | string[] | boolean[]) : arr is boolean[] { 
    return arr.length > 0 && typeof arr[0] === 'boolean'; 
} 

function isArrayOfStrings(arr: number[] | string[] | boolean[]) : arr is string[] { 
    return arr.length > 0 && typeof arr[0] === 'string'; 
} 
Смежные вопросы