TypeScript получает тип для экземпляра класса

#typescript #class #typescript-typings #return-type #typeof

#машинописный текст #класс #typescript-типизация #возвращаемый тип #typeof

Вопрос:

Я использую библиотеку, которая предоставляет SDK, но не тип ( UserModule ) одного из объектов ( user ), которые вы можете создать с его помощью.

 import { Magic } from 'magic-sdk';

// ...

function useMagicLinkAuthentication() {
  const [magicReady, setMagicReady] = usePromise<Magic>();
  const [isMagicInitialized, setMagicInitialized] = useState(false);
  const [user, setUser] = useState<UserModule | null>(null);

  // ...

  const signIn = async (email: string) => {
    const magic = await magicReady;

    if (await magic.user.isLoggedIn()) {
      return setUser(magic.user);
    }

    await magic.auth.loginWithMagicLink({ email });
    return setUser(magic.user);
  };

  // ...
}
 

Как вы можете видеть, мне нужен доступ к UserModule тому, к useState чему у меня нет доступа (потому что я не могу этого сделать import { UserModule } from 'magic-sdk'; .

Для функций есть ReturnType . Так что, если у меня есть обычная функция, я могу сделать:

 export const createFoo = () => { /* ... returns a Foo ... */ } 
export type Foo = ReturnType<typeof createFoo>;
 

Есть ли эквивалент для классов в TypeScript, чтобы я мог получить доступ к экземпляру new MyClass и получить

 // broken pseudo-code
export type Foo  = Something<typeof MyClass.foo>
 

?

Мне нужно как-то получить typeof magic.user ака UserModule -тип.

Комментарии:

1. К вашему сведению, существует встроенный тип утилиты InstanceType : typescriptlang.org/docs/handbook / … Но, похоже, на самом деле это не то, что вам здесь нужно.

Ответ №1:

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

 type UserModule = Magic['user'];