如何在打字稿中使用道具类型作为类型定义?
How to use prop-types as type definition in typescript?
情况:
考虑让 myTypes
常量持有道具类型(写在名为 my-component.js
的文件中的某处),如下所示:
import React from 'react'
import { View } from 'react-native'
import PropTypes from 'prop-types'
export const myTypes = {
activeColor: PropTypes.string,
color: PropTypes.string,
fontFamily: PropTypes.string,
fontSize: PropTypes.number,
fontWeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
height: PropTypes.number,
icon: PropTypes.node,
iconOverlay: PropTypes.node,
marginBottom: PropTypes.number,
marginLeft: PropTypes.number,
marginRight: PropTypes.number,
marginTop: PropTypes.number,
maxHeight: PropTypes.number,
minHeight: PropTypes.number,
onBlur: PropTypes.func,
onChangeText: PropTypes.func,
paddingBottom: PropTypes.number,
paddingLeft: PropTypes.number,
paddingRight: PropTypes.number,
paddingTop: PropTypes.number
}
export default class MyComponent extends React.Component {
static propTypes = myTypes
render () {
return (
<View></View>
);
}
}
您将如何使用 myTypes
作为类型或助手来启用 IDE 自动完成?
下面是我尝试过的(在 type-script
中编写的另一个文件中):
import MyComponent, { myTypes } from 'my-component';
const dark_theme_properties: myTypes = {
activeColor: 'green'
};
但是,当然,这会导致 'myTypes' refers to a value, but is being used as a type here. ts(2749)
错误,并且使用 typeof myTypes
也不会在 IDE 中提供正确的自动完成功能。
Note that the component is written in JavaScript ES6
while the desired auto-complete is expected in type-script
(where aforementioned JS is imported).
由于您使用的是 Typescript,因此您可以创建一个界面作为 type-helper 和自动完成功能。
import React from 'react'
export interface myTypes {
activeColor: string;
color: string;
fontFamily: string;
fontSize: number;
fontWeight: string | number;
height: number;
icon: React.ReactNode;
iconOverlay: React.ReactNode;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
maxHeight: number;
minHeight: number;
onBlur: () => void;
onChangeText: () => void;
paddingBottom: number;
paddingLeft: number;
paddingRight: number;
paddingTop: number;
}
import { myTypes } from "my-types-interface";
const dark_theme_properties: myTypes = {
activeColor: "green",
...
};
我们可以使用 @types/prop-types
包的 InferProps
从 prop-type 对象中提取 raw-type,例如:
import PropTypes, { InferProps } from 'prop-types'
const myTypes = {
activeColor: PropTypes.string,
// ...
}
type MyComponentProps = InferProps<typeof myTypes>
const dark_theme_properties: MyComponentProps = {
activeColor: 'green'
// ...
};
https://fettblog.eu/typescript-react/prop-types/
import PropTypes, { InferProps } from "prop-types";
import React from 'react';
function Article({
title,
price
}: InferProps<typeof Article.propTypes>) {
return (
<div className="article">
<h1>{title}</h1>
<span>Priced at (incl VAT): {price * 1.2}</span>
</div>
);
}
Article.propTypes = {
title: PropTypes.string.isRequired,
price: PropTypes.number.isRequired
};
export default Article;
情况:
考虑让 myTypes
常量持有道具类型(写在名为 my-component.js
的文件中的某处),如下所示:
import React from 'react'
import { View } from 'react-native'
import PropTypes from 'prop-types'
export const myTypes = {
activeColor: PropTypes.string,
color: PropTypes.string,
fontFamily: PropTypes.string,
fontSize: PropTypes.number,
fontWeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
height: PropTypes.number,
icon: PropTypes.node,
iconOverlay: PropTypes.node,
marginBottom: PropTypes.number,
marginLeft: PropTypes.number,
marginRight: PropTypes.number,
marginTop: PropTypes.number,
maxHeight: PropTypes.number,
minHeight: PropTypes.number,
onBlur: PropTypes.func,
onChangeText: PropTypes.func,
paddingBottom: PropTypes.number,
paddingLeft: PropTypes.number,
paddingRight: PropTypes.number,
paddingTop: PropTypes.number
}
export default class MyComponent extends React.Component {
static propTypes = myTypes
render () {
return (
<View></View>
);
}
}
您将如何使用 myTypes
作为类型或助手来启用 IDE 自动完成?
下面是我尝试过的(在 type-script
中编写的另一个文件中):
import MyComponent, { myTypes } from 'my-component';
const dark_theme_properties: myTypes = {
activeColor: 'green'
};
但是,当然,这会导致 'myTypes' refers to a value, but is being used as a type here. ts(2749)
错误,并且使用 typeof myTypes
也不会在 IDE 中提供正确的自动完成功能。
Note that the component is written in
JavaScript ES6
while the desired auto-complete is expected intype-script
(where aforementioned JS is imported).
由于您使用的是 Typescript,因此您可以创建一个界面作为 type-helper 和自动完成功能。
import React from 'react'
export interface myTypes {
activeColor: string;
color: string;
fontFamily: string;
fontSize: number;
fontWeight: string | number;
height: number;
icon: React.ReactNode;
iconOverlay: React.ReactNode;
marginBottom: number;
marginLeft: number;
marginRight: number;
marginTop: number;
maxHeight: number;
minHeight: number;
onBlur: () => void;
onChangeText: () => void;
paddingBottom: number;
paddingLeft: number;
paddingRight: number;
paddingTop: number;
}
import { myTypes } from "my-types-interface";
const dark_theme_properties: myTypes = {
activeColor: "green",
...
};
我们可以使用 @types/prop-types
包的 InferProps
从 prop-type 对象中提取 raw-type,例如:
import PropTypes, { InferProps } from 'prop-types'
const myTypes = {
activeColor: PropTypes.string,
// ...
}
type MyComponentProps = InferProps<typeof myTypes>
const dark_theme_properties: MyComponentProps = {
activeColor: 'green'
// ...
};
https://fettblog.eu/typescript-react/prop-types/
import PropTypes, { InferProps } from "prop-types";
import React from 'react';
function Article({
title,
price
}: InferProps<typeof Article.propTypes>) {
return (
<div className="article">
<h1>{title}</h1>
<span>Priced at (incl VAT): {price * 1.2}</span>
</div>
);
}
Article.propTypes = {
title: PropTypes.string.isRequired,
price: PropTypes.number.isRequired
};
export default Article;