Тип функции - TypeScript - PullRequest
0 голосов
/ 02 мая 2018

Чтобы определить тип функции, приведенный ниже пример не позволяет const

interface Square{
    readonly color: string;
    readonly area: number;
}

interface compareTo{
    (const v1: Square, const v2: Square): number;  // syntax error      
}

Как сравнить v1 & v2 без изменения указателя объекта (Square), на который он указывает?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как объясняется в другом ответе, const не предотвращает изменение объектов в ES6, оно только предотвращает переназначения.

Чтобы предотвратить глобальное переназначение параметров, можно использовать TSLint no-parameter-reassignment rule .

Для предотвращения изменения объекта во время выполнения , Object.freeze следует использовать. Это может быть применено во время компиляции с Readonly сопоставленным типом . Однако это не будет иметь никакого эффекта, если типы совместимы:

interface compareTo {
    (v1: Readonly<Square>, v2: Readonly<Square>): number;      
}
const foo: compareTo = (a: Square, b: Square) => {
  a.area = 0;
  return 1;
}   

Как правило, интерфейс не обязан сообщать, как функция должна работать внутри, он просто описывает ее интерфейс, поэтому он будет выглядеть так:

interface compareTo {
    (v1: Square, v2: Square): number;      
}
const foo: compareTo = (a: Readonly<Square>, b: Readonly<Square>) => {
  a.area = 0; // error
  return 1;
}   

Но это будет работать, если типы выводятся из универсального типа, то есть a тип не указан в compareTo реализации:

interface compareTo<T = Readonly<Square>> {
    (v1: T, v2: T): number;      
}

const foo: compareTo = (a, b) => {
  a.area = 0; // error
  return 1;
}   
0 голосов
/ 02 мая 2018

Нет способа объявить это, потому что это ни на что не повлияет. const в TypeScript не означает неизменный - он применяется только к привязке, а параметр функции не является внешне видимой привязкой.

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