reactjs - Dijeljenje TypeScript modula sa svakim paketom u monorepu
Imam monorepo React komponenti koje su izrađene koristeći styled-components, a svoje teme dobivaju od pružatelja tema.
declare module 'styled-components' {
export interface DefaultTheme {
colours: Colours;
spacing: Spacing;
breakpoints: Breakpoints;
}
}
Gore navedeno trenutno se nalazi u mojoj mapi root tipova <root>/types/styled.d.ts
Međutim, imam oko 20 paketa komponenti, i taj broj raste.
Kada uključim gore navedenu datoteku u moj direktorij komponenti src, moj IntelliSense radi.
<root>/components/[component name]/src/[src files + styled.d.ts]Međutim, uključivanje iste datoteke u svaki paket djeluje pretjerano?
Postoji li način, možda korištenjem tsconfig-a? Da kažem svom paketu da umjesto toga koristi gore navedeni modul iz moje root types mape?
Hvala!
Uredi :
Ažurirao sam svoje datoteke da se uvoze ovako: import '@common-types/styled';
Ovo radi kako se očekivalo - Je li ovo pravi način da se to učini?
Odgovor #1
Iako nisam siguran što je 'idealni' pristup, tvoje pitanje mi je pomoglo sličnom problemu.
Ono što radim je uključivanje deklaracije u istu datoteku gdje je MyTheme deklariran (npr. <rootDir>/packages/theme/src/theme.ts).
export type MyThemetype = {
colors: {
foreground: 'black' | 'white',
}
}
declare module 'styled-components' {
export interface DefaultTheme extends MyThemeType {}
}
MyThemeType na kraju se eksportira u <rootDir>/packages/theme/src/index.ts ovog paketa (nazovimo ga @my-lib/theme).
Tada ga koristim na drugim paketima koji imaju @my-lib/theme kao ovisnost.
Npr. <rootDir>/packages/label/...
import '@my-lib/theme'
import styled from 'styled-components'
const Label = styled.span`
color: ${({ theme }) => theme.colors.foreground} // intellisense works as expected
`
export default Label
Što vjerujem da je slično onome što radite, pa hvala vam!
Odgovor #2
Da bih dijelio declare module *** između projekata u monorepu, moje rješenje
- kreiraj projekt uobičajenog tipa
aweb-types, dodajglobal.d.tskoji je dolje
import { pageLoading } from './src/loading/PageLoading'
declare module 'vue/types/vue' {
interface Vue {
$loading: typeof pageLoading
}
}
- jer trebam proširiti definiciju
Vue, trebao bih imatiVueunode_modulesodaweb-types
"peerDependencies": {
"vue": "^2.7.16"
},
- Mogu koristiti ovaj
global.d.tsutsconfig.jsonciljane projekte
// tsconfig.json
{
"files": ["../../packages/aweb-types/global.d.ts"],
}
sada mogu povezati this.$loading.show() u vscode unesite opis slike ovdje
