reactjs - Tyyppi 'string' ei ole määritettävissä tyypille '"inherit" | "initial" | "unset" | "fixed" | "absolute" | "static" | "relative" | "sticky"'
Saan seuraavan virheen sovelluksessani (npm 5.4.2, react 15.4, typescript 2.5.3, webpack 2.2.1, webpack-dev-server 2.4.1).
Tämä toimii:
<div style={{position: 'absolute'}}>working</div>
Tätä ei käännetä:
const mystyle = {
position: 'absolute'
}
<div style={mystyle}>not working</div>
Käännösvirhe on:
ERROR in ./src/components/Resource.tsx
(61,18): error TS2322: Type '{ style: { position: string; }; children: string; }' is not assignable to type 'DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>'.
Type '{ style: { position: string; }; children: string; }' is not assignable to type 'HTMLAttributes<HTMLDivElement>'.
Types of property 'style' are incompatible.
Type '{ position: string; }' is not assignable to type 'CSSProperties'.
Types of property 'position' are incompatible.
Type 'string' is not assignable to type '"inherit" | "initial" | "unset" | "fixed" | "absolute" | "static" | "relative" | "sticky"'.
webpack: Failed to compile.
Mutta mikä ero sillä on? Voin korjata sen näin:
const mystyle = {
position: 'absolute' as 'absolute'
}
mutta onko tämä hyvä ratkaisu?
Minulla ei ole tätä ongelmaa muiden tyyli/CSS-ominaisuuksien kanssa.
Löysin samanlaisen ongelman GitHubista: https://github.com/Microsoft/TypeScript/issues/11465 mutta jos ymmärsin oikein, se oli TypeScriptin bugi aikaisemmassa versiossa.
Kaikki apu on tervetullutta.
Vastaus #1
Tämä on kiertotie, mutta se on okei. Jokin muu ratkaisu on:
const mystyles = {
position: 'absolute',
} as React.CSSProperties;
Voit tarkistaa myöhemmin, milloin tämä ongelma ratkaistaan. Arviolta TS 2.6 tienoilla, jos katsoo virstanpylväitä.
Vastaus #2
Käytä React.CSSProperties-tyyppiä:
import React, { CSSProperties } from "react";
const myStyles: CSSProperties = {
position: 'absolute',
}
Sitten käytä tyyliä normaalisti:
<div style={myStyles} />
Vastaus #3
Voit saada TypeScriptin päättelemään kirjaimellisia arvoja koko objektista käyttämällä const-väittämää:
const mystyle = {
position: 'absolute'
} as const;
Näin ollen, jos lisäät lisää ominaisuuksia mystyle -tyyliin, se toimii myös niille.
Vastaus #4
Superluminaryn vastaus ei toimi, jos sinulla on sisäkkäisiä tyyliobjekteja. Tässä tapauksessa voit luoda tyypin:
import React, { CSSProperties } from 'react';
export interface StylesDictionary{
[Key: string]: CSSProperties;
}
Ja käytä sitä näin:
const styles:StylesDictionary = {
someStyle:{
display:'flex',
justifyContent:'center',
},
someOtherStyle:{
display:'flex',
justifyContent:'center',
alignItems:'center',
}
}
Ja sitten:
<div style={styles.someStyle} />
