Убедитесь, что объект не является экземпляром какого-либо класса в машинописи - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть функция, которая принимает объекты и проксирует их.

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

Как можно Я делаю это?


type NonClassObject = ???;
export function createObjectProxy(obj: NonClassObject) {
  return new Proxy(obj, {});
}

const foo: NonClassObject = {};
const bar: NonClassObject = {} as HTMLElement; // this should be a type error

Кажется, нет особого различия между guish двумя, за исключением типа конструктора. Я не уверен, есть ли способ сказать Exact<tyepof OBJ.constructor, Object> ... но я сейчас изучаю типы утилит.

enter image description here enter image description here


На что-то: enter image description here


Тупик: https://github.com/Microsoft/TypeScript/issues/3841

1 Ответ

0 голосов
/ 14 февраля 2020

Существует открытый вопрос о том, чтобы сделать тип конструктора более определенным (https://github.com/Microsoft/TypeScript/issues/3841), но ему 4 года, и, похоже, он никуда не денется.

В качестве временного решения я мы только начали добавлять { _noMyProjectProxy: true } ко всем моим классам и перечислять все, к чему у меня нет доступа. Выглядит это так:

type NonClassObject<TYPE> = 
  TYPE extends HTMLElement ? never :
  TYPE extends Event ? never :
  TYPE extends OtherClass ? never :
  TYPE extends { _noMyProjectProxy: any } ? never : 
  TYPE;

export function createObjectProxy<TYPE extends object>(obj: NonClassObject<TYPE>) {
  return new Proxy(obj, {});
}

Это не красиво и не элегантно, но работает, когда больше ничего не было.

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