Типографская защита шрифта для любого параметра функции [] - PullRequest
1 голос
/ 26 января 2020

Интересно, имеет ли смысл иметь этот экземпляр проверки typeguard для такой функции:

Foo(value: any[]) {
    if (value instanceof Array) {
        Console.log('having an 
        array')
    } 
}

Поскольку параметр был объявлен как массив any, это автоматически означает, что значение времени выполнения должно быть всегда экземпляр массива?

Является ли это конкретным c случаем, когда что-либо задействовано и необходима защита типа?

Что я имею в виду: гарантирует ли указание типа параметра, что во время выполнения этот параметр отображается такого типа в инструментах разработчика? В этом случае экземпляр этого типа представляет собой бесполезную проверку.

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Ниже поможет во время выполнения, но это не TypeGuard

function Foo(value: any[]): void {
  if (Array.isArray(value)) {
    console.log("having an array");
  }
  throw new Error(`${value} is not an array!`);
}

TypeGuards помогает сузить типы во время компиляции / при записи **

// Senario 1: It could be an array but also a number but we need to narrow down
// the type so we can apply appropriate logic but we don't want to throw an exception:

// let's create a typeguard for this:

function isArray(value: any[] | number): value is any[] {
  return Array.isArray(value);
}

function isNumber(value: any[] | number): value is number {
    return !Number.isNaN(Number(value));
}

function Foo2(value: any[] | number): string | boolean | undefined {
  // lets use the guard
  if (isArray(value)) {
    // now value is array for TS
    return value.includes("something");
  }
  if (isNumber(value)) {
    // now value is number for TS
    return value.toFixed(4);
  }
}

// Senario 2: Value can be array or number but we definitely want it
// to be a number, otherwise we want to throw an error:

// let's create a typeguard for this:

function assertNumber(value: any[] | number): asserts value is number {
  if (!Number.isInteger(Number(value))) {
    throw new Error(`${value} is not a number`);
  }
}

function Foo3(value: any[] | number): string {
  // lets use the guard
  assertNumber(value);
  // now value is number for TS
  return value.toFixed(4);
}
0 голосов
/ 26 января 2020

Ваше условие if внутри Foo () не имеет значения, так как при разработке компилятора с throw error, если массив не передается в качестве параметра в методе. переданный в javascript код отправляется в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...