Как я могу получить fn ({param}) типа param в TypeScript? - PullRequest
0 голосов
/ 04 августа 2020

Я использую необработанный эмоции пакет npm i emotion и наткнулся на этот вопрос.

Если я сделаю это

import { css } from 'emotion';

const test = css({
  boxSizing: 'border-box'
})

Если я наведу boxSizing, VSCode сообщает мне, что тип boxSizing равен

"border-box" | "-moz-initial" | "inherit" | "initial" | "revert" | "unset" | "content-box" | BoxSizingProperty[] | undefined

Теперь я хочу получить этот тип, в результате чего получается

type result = "border-box" | "-moz-initial" | "inherit" | "initial" | "revert" | "unset" | "content-box" | BoxSizingProperty[] | undefined

Есть ли какой-нибудь служебный метод, который я могу использовать для получить эти типы?

Если я могу просто сделать

import { css } from 'emotion';

type result = someUtility<typeof css, 'boxSizing'>

Можно ли сделать это без установки нового пакета npm? Я знаю, что эмоции используют csstype пакет для набора текста под капотом.

1 Ответ

2 голосов
/ 04 августа 2020

Поскольку вы не хотите устанавливать другой пакет, вот что вы можете сделать:

import { ObjectInterpolation } from 'emotion'

type BoxSizing = ObjectInterpolation<undefined>['boxSizing'] // type BoxSizing = "-moz-initial" | "inherit" | "initial" | "revert" | "unset" | "border-box" | "content-box" | BoxSizingProperty[] | undefined

Вы также можете найти Parameters generi c type полезным, хотя я не верю, что здесь это работает, поскольку Interpolation<T> - это тип объединения нескольких элементов. Вот пример того, как это можно использовать в другой функции:

const example = (params: { boxSizing: 'border-box' }) => undefined

type BoxSizing = Parameters<typeof example>[0]['boxSizing']

...