Симпатичнее не поддерживает частные методы, несмотря на то, что утверждает, что

#typescript #prettier

Вопрос:

Согласно #5660, prettier поддерживает частные методы и свойства. Но когда я запускаю его в файле машинописного текста, который имеет частные методы и свойства, он жалуется, что это не так.

Команда:

 npx prettier "src/web-components/registerCustomElement.tsx"
 

.красивая.yml:

 trailingComma: es5
tabWidth: 4
semi: false
singleQuote: true
arrowParens: avoid
printWidth: 80
importOrder:
  - "^@"
  - "^(?!src|\.)"
  - "^. "
importOrderSeparation: true
overrides:
  - files:
    - "*.json"
    options:
      tabWidth: 2
 

src/веб-компоненты/registerCustomElement.tsx:

 import type { ComponentType } from 'react'
import ReactDOM from 'react-dom'

type Args = {
    name: string
    attributes: string[]
    component: ComponentType<unknown>
}

/**
 * Register a custom element which wraps a React component.
 *
 * @param name       - the name of the custom element
 * @param attributes - the names of the custom element's attributes
 * @param component  - the React component
 */
export default function registerCustomElement({ name, attributes, component: Component }: Args) {
    const webComponentClass = class extends HTMLElement {
        readonly #mountPoint: HTMLElement
        readonly #shadowRoot: ShadowRoot

        constructor() {
            super()
            this.#mountPoint = document.createElement('div')
            this.#shadowRoot = this.attachShadow({ mode: 'open' })
        }

        connectedCallback() {
            if (this.isConnected) {
                const attrs = attributes.reduce((acc, key) => Object.assign(acc, { [key]: this.getAttribute(key) }), {})

                this.#shadowRoot.appendChild(this.#mountPoint)
                ReactDOM.render(<Component {...attrs} />, this.#mountPoint)
            }
        }

        disconnectedCallback() {
            if (!this.isConnected) {
                this.#shadowRoot.removeChild(this.#mountPoint)
            }
        }
    }

    customElements.define(name, webComponentClass)
}
 

Результат:

 src/web-components/registerCustomElement.tsx[error] src/web-components/registerCustomElement.tsx: SyntaxError: This experimental syntax requires enabling one of the following parser plugin(s): 'classPrivateProperties, classPrivateMethods' (19:17)
 

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

1. Обходной путь заключается в использовании private вместо # . Я использовал # , потому shadowRoot что уже существует HTMLElement . Однако с тех пор я обнаружил, что attachShadow наборы shadowRoot , поэтому я использую private вместо # . Тем не менее, было бы неплохо узнать, поддерживается ли/как это в prettier.

2. Вы можете добиться этого с помощью плагинов, упомянутых в заявлении об ошибке. См. PR для функций: Добавьте поддержку частных методов класса и добавьте поддержку свойств ClassPrivateProperty.