vue.js - Vue TSX - Hvordan fortelle Typescript at HTML-attributter er tillatt i gjenbrukbare komponenter?
Anta at jeg har denne inndatakomponenten:
import { defineComponent } from "@vue/runtime-core"
export default defineComponent({
inheritAttrs: false,
setup(props, { attrs }) {
return () => (
<div>
<input type="text" {...attrs} />
</div>
)
}
})
Nå bruker jeg denne komponenten slik og gir type="password"-attributt:
import { defineComponent } from "@vue/runtime-core"
import Input from "./components/input"
export default defineComponent({
setup(props, { attrs }) {
return () => <Input type="password"></Input>
}
})
Men Typescript klager:
Property 'type' does not exist on type 'IntrinsicAttribute'> & VNodeProps & AllowedComponentProps & ComponentCustomProps>'
Svar #1
Så jeg er ikke en Vue.JS-ekspert (vennligst si ifra hvis det ikke fungerer og hvorfor), men etter litt research fant jeg ut at du må skrive props ved å legge til et props-objekt til defineComponent. Det vil fortelle TypeScript at du kan sende spesifikke props.
import { defineComponent } from "@vue/runtime-core"
export default defineComponent({
inheritAttrs: false,
props: {
type: String // this is the typing (warning: you cannot use typescript types here)
}
setup(props, { attrs }) {
return () => (
<div>
<input type={props.type ?? "text"} {...attrs} />
</div>
)
}
})
Du kan spørre hva ??-operatøren gjør. Jeg liker å kalle den for «standardiseringsoperatøren» fordi den standardiserer verdien før den med verdien etter. I dette tilfellet betyr det at hvis props.type er undefined eller null, vil den erstatte den med "text".
