Ограничить параметр типа интерфейса в методе - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь передать, что метод имеет смысл только тогда, когда параметр типа его интерфейса соблюдает определенное ограничение.Вот (некомпилируемый) пример:

interface Array<T> {
    fold<B>(base: B, f: (acc: B, e: T) => B): B
    sum(): T is number
}

Array.prototype.fold = function(base, f) {
    let result = base
    for (let i = 0; i < this.length; i++)
        result = f(result, this[i])
    return result
}

Array.prototype.sum = function() {
    return this.fold(0, (acc, e) => acc + e)
};

[1, 'a', 3].sum() //? 1a3  <-- should be an error!

Здесь я пытался передать, что sum имеет смысл только тогда, когда T extends number.

1 Ответ

0 голосов
/ 26 апреля 2018

У вас правильная идея, просто неправильный синтаксис.

Вот как вы пишете это.

interface Array<T> {
  sum(this: number[]): number;
}

Обратите внимание, как мы использовали тип this, который являетсяСинтетический параметр не меняет арность функции.Синтаксис, который вы пытались использовать, хотя и является интересным предположением, используется для другой цели, а именно для защиты типов.

Интересная часть заключается в том, что аннотация типа в this имеет приоритет над типом интерфейса.Вы также можете объявить универсальный параметр, применить его к this и наложить ограничения на T, чтобы он также мог быть скомпонован.Существует масса гибкости.

Вот интересный, который сочетает в себе как тип интерфейса, так и уточняя его с помощью this

interface Array<T> {
  flatten(this: T[][]): T[];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...