Typescript: TS2322: Ketik 'string' tidak dapat ditetapkan untuk mengetik '"absolut" | "relatif" | tidak terdefinisi'

Dibuat pada 9 Okt 2016  ·  3Komentar  ·  Sumber: microsoft/TypeScript

Versi TypeScript: 2.1.0-dev.20161008

Komponen ReactNative Minimal untuk menggambarkan masalah:

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     
    }
});

Kesalahan:

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'.

Saya suka bahwa deklarasi reactnative tidak menggunakan string, tetapi hanya mengizinkan set string yang mungkin.

Apakah ada cara untuk membiarkan TypeScript menyimpulkan ini untuk mengetik 'absolut'?
Mungkin jika saya bisa menandai bidang position sebagai hanya baca, ini bisa menyimpulkan untuk mengetik 'absolut'.

Terkait dengan # 10676?

Question

Komentar yang paling membantu

Saya tidak suka melakukan casting dan mencegahnya sebanyak mungkin, tetapi berikut ini solusinya:

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

Ketika tidak ada antarmuka yang diekspor (di sini: TextStyle), kita hanya dapat mentransmisikan bidang:

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

Semua 3 komentar

Saya tidak suka melakukan casting dan mencegahnya sebanyak mungkin, tetapi berikut ini solusinya:

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

Ketika tidak ada antarmuka yang diekspor (di sini: TextStyle), kita hanya dapat mentransmisikan bidang:

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

Ini juga bisa menjadi kasusnya: https://github.com/Microsoft/TypeScript/issues/21618#issuecomment -362945112

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

CyrusNajmabadi picture CyrusNajmabadi  ·  3Komentar

zhuravlikjb picture zhuravlikjb  ·  3Komentar

blendsdk picture blendsdk  ·  3Komentar

Antony-Jones picture Antony-Jones  ·  3Komentar

siddjain picture siddjain  ·  3Komentar