Typescript: TS2322: O tipo 'string' não pode ser atribuído ao tipo '"absoluto" | "relativo" | Indefinido'

Criado em 9 out. 2016  ·  3Comentários  ·  Fonte: microsoft/TypeScript

Versão do TypeScript: 2.1.0-dev.20161008

Componente reativo mínimo para ilustrar o problema:

import React, { Component } from 'react';
import { StyleSheet, Text } from 'react-native';

export class Sample extends Component<{}, {}> {
    render() {
        return (
            <Text style={styles.text}>Hello TypeScript</Text> // error on styles, see below
        );
    }
}

const styles = StyleSheet.create({
    text: {
        position: 'absolute', // cause of the error: string instead of 'absolute'
        top: 0,
        left: 0     
    }
});

Erro:

error TS2322: Type '{ position: string; top: number; left: number; }' is not assignable to type 'TextStyle | undefined'.
  Type '{ position: string; top: number; left: number; }' is not assignable to type 'TextStyle'.
    Types of property 'position' are incompatible.
      Type 'string' is not assignable to type '"absolute" | "relative" | undefined'.

Eu gosto que a declaração reativa não use string, mas apenas permita o conjunto de strings possíveis.

Existe alguma maneira de permitir que o TypeScript deduza isso ao tipo 'absoluto'?
Talvez se eu pudesse marcar este campo position como somente leitura, ele poderia inferir o tipo 'absoluto'.

Relacionado a # 10676?

Question

Comentários muito úteis

Não gosto de lançar e evitar tanto quanto possível, mas aqui estão as soluções alternativas:

const styles = StyleSheet.create({
    text: {
        position: 'absolute',
        top: 0,
        left: 0     
    } as React.TextStyle // cast to existing interface
});

Quando não há interface exportada (aqui: TextStyle), podemos lançar apenas o campo:

const styles = StyleSheet.create({
    text: {
        position: 'absolute' as 'absolute', // cast string to type 'absolute'
        top: 0,
        left: 0     
    }
});

Todos 3 comentários

Não gosto de lançar e evitar tanto quanto possível, mas aqui estão as soluções alternativas:

const styles = StyleSheet.create({
    text: {
        position: 'absolute',
        top: 0,
        left: 0     
    } as React.TextStyle // cast to existing interface
});

Quando não há interface exportada (aqui: TextStyle), podemos lançar apenas o campo:

const styles = StyleSheet.create({
    text: {
        position: 'absolute' as 'absolute', // cast string to type 'absolute'
        top: 0,
        left: 0     
    }
});
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

yortus picture yortus  ·  157Comentários

kimamula picture kimamula  ·  147Comentários

tenry92 picture tenry92  ·  146Comentários

rwyborn picture rwyborn  ·  210Comentários

blakeembrey picture blakeembrey  ·  171Comentários