¿Cómo decido si @types/* entra en `dependencias` o `devDependencies`?

Resuelto kamyl asked hace 7 años • 5 respuestas

Utilizo TypeScript 2 en mi proyecto. Me gustaría usar alguna biblioteca js, pero también mecanografía para esa biblioteca. Puedo instalar tipos con archivos npm install @types/some-library. No estoy seguro si debería hacerlo yo --saveo --save-devellos. Me parece que incluso el archivo Léame de GitHub de DefinetelyTyped menciona ambas versiones, pero nunca las explica. Pensaría que @types debería estar en devDependencies, ya que los tipos son necesarios para el desarrollo y no se usan en tiempo de ejecución, pero vi muchas veces @types en solo dependencies. Estoy confundido.

¿ Cómo debo decidir si @types/* entra en dependencieso devDependencies? ¿Existen realmente algunas instrucciones más o menos oficiales?

kamyl avatar Jul 19 '17 03:07 kamyl
Aceptado

Digamos que está desarrollando un paquete "A" que tiene @types/some-moduleel paquete en formato devDependencies. Por alguna razón estás exportando el tipo de @types/some-module:

import { SomeType } from 'some-module';

export default class APackageClass {
  constructor(private config: SomeType) {
    // …       
  }
}

En este momento, los consumidores de TypeScript del paquete "A" no pueden adivinar qué SomeTypees, ya que devDependenciesel paquete "A" no está instalado.

En ese caso particular, debe colocar @types/*el paquete con regular dependencies. Para otros casos devDependencieses suficiente.

wookieb avatar Sep 02 '2017 07:09 wookieb

Si solo estás generando un paquete, es posible que no sea necesario hacer la distinción entre dependenciesy devDependencies. Esta característica npmes generalmente útil cuando se publica un paquete que otros pueden utilizar y no desea enviarles spam con dependencias redundantes.

Puede haber otros casos de uso en los que dividir las dependencias puede resultar útil, pero a menos que tenga una necesidad expresa de hacerlo, mi consejo es elegir cualquiera de los dos y colocar todo allí. No es difícil dividirlos después si fuera necesario.

Un ejemplo bien conocido de esta práctica en la vida real es que create-react-app, de forma predeterminada, el texto estándar no expulsado que crea coloca todo dependencies, consulte este hilo y esta respuesta.

Valentin avatar Jul 18 '2017 20:07 Valentin

En el caso particular de implementar una aplicación Node.js en producción, se desea instalar solo las dependencias necesarias para ejecutar la aplicación.

npm install --omit=devo

npm ci --productiono

yarn --production

En ese caso, los tipos deben estar en devDependencies, para evitar que hinchen la instalación.

(Para evitar malentendidos, la opción --productiono --omit=devno debe usarse en las máquinas donde se crea la aplicación; de lo contrario, el compilador de TypeScript se quejará).

Observaciones: Soy consciente de que esto fue mencionado en un comentario de Brad Wilson en otra respuesta. Sin embargo, este punto parece digno de ser una respuesta.

Carsten Führmann avatar Sep 05 '2019 17:09 Carsten Führmann

Dependiendo de para qué se utilizará su código. Si necesita los tipos en su código de producción (por ejemplo, si crea un paquete personalizado que reexporta los tipos), entonces debería estar en ; dependenciesde lo contrario, si es solo para fines de desarrollo, devDependencieses el lugar correcto para colocarlos.

hpapier avatar Sep 04 '2023 09:09 hpapier

Otras respuestas tenían mucho sentido, pero agregaré que el paquete de declaración de tipo de peerDep también debe colocarse en dependencieslugar de peerDependencies.

Supongamos que bes un complemento de a. Y cutiliza ay b.

¿Por qué no debería @types/acolocarse en b's peerDependencies?

Si bes package.jsoncomo:

{
  "peerDependencies": {
    "a": "1.5.x"
    "@types/a": "1.4.x"
  }
}

cPuede utilizar sólo interfaces definidas en @types/[email protected]pero cestá obligado a instalar @types/[email protected].

Además, cpuede ser un paquete javascript normal en lugar de un paquete mecanografiado, pero ctambién está obligado a instalarlo @types/[email protected].

Entonces, lo correcto package.jsondebería bser como:

{
  "peerDependencies": {
    "a": "1.5.x"
  },
  "dependencies": {
    "@types/a": "1.4.x"
  }
}
Zim avatar Jun 07 '2022 03:06 Zim