Есть ли способ получить общий тип c, который расширяется другим типом c в TypeScript? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть интерфейс, который предназначен для типов, которые могут преобразовывать себя в IDBKey:

interface IDBValidKeyConvertible<TConvertedDBValidKey extends IDBValidKey> {
    convertToIDBValidKey: () => TConvertedDBValidKey;
}

Затем у меня есть класс, который я хочу принять, тип IDBKey или IDBValidKeyConvertible:

class InMemoryIndexedKeyValueStore<TKey extends IDBValidKey | IDBValidKeyConvertible<UKey>, TValue> {
    public constructor(public readonly storeName: string) { }

    private getDbKeyFromKey(key: TKey): TKey | UKey {
        return isIDBValidKeyConvertible(key) ? key.convertToIDBValidKey() : key;
    }

   ...
}

Но это не работает так, как написано, потому что tsc дает эту ошибку около UKey в объявлении класса: Cannot find name 'UKey'

Это из-за this Проблема с TypeScript, когда универсальные типы не могут быть «высокодородными типами»? Или я еще что-то не так делаю?

Спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Вы можете использовать такой условный тип:

type ConvertedKey<TKey> = TKey extends IDBValidKeyConvertible<infer UKey> ? UKey : TKey;

private getDbKeyFromKey(key: TKey): ConvertedKey<TKey> {
  return this.isIDBValidKeyConvertible(key) ? key.convertToIDBValidKey() : key;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...