かなりの数の問題がここにあります。警告される:
あなたはProptyDontHaveChildren
タイプnever
またはundefined
のchildren
オプションのプロパティを作ることができる(これは、プロパティがオプションであることが重要です):
type ChildrenType = Array<number>
interface ProptyDontHaveChildren {
[index: string]: string;
children?: never; // note the ?
}
ProptyDontHaveChildren
からのみ作成することができることを保証します不足または定義されていないものがあります。children
しかし、今の交差点
IntersectionType
あなたが望むものではありません。タイプ
undefined
のと種類
ChildrenType
の両方のこと
children
交差点の需要は、起こることができないので、それはまた
children
を持つことはできません。
let oops: IntersectionType = { children: [1, 2, 3] } // error
あなたは、あなたが何を望むか(
ProptyHaveChildren
を定義することができるように
はこれを行うには最善のことは、基本Propty
タイプの交差点とWithoutChildren
タイプとしてProptyDontHaveChildren
を定義することですIntersectionType
)は、Propty
とWithChildren
の交点になります。このように:
interface Propty {
[index: string]: string;
}
interface WithoutChildren {
children?: never
}
interface WithChildren {
children: ChildrenType
}
type ProptyDontHaveChildren = Propty & WithoutChildren
type ProptyHaveChildren = Propty & WithChildren
しかし、まだ問題があります。 ProptyHaveChildren
タイプは、children
のプロパティを持つことはできません。インデックスシグネチャでは、のタイプの(children
を含む)が必要になるためです。だから、children
が起こることができないnumber
のstring
と配列の両方でなければなりません:私はここから
const proptyHaveChildren: ProptyHaveChildren = {
a: "a",
children: [1, 2, 3]
}; // error!
function createElement(type: string, props: ProptyDontHaveChildren, ...children: ChildrenType) {
// error!
const newProps:ProptyHaveChildren = { children: children, ...props }
}
続行したいかどうかはわかりません。 TypeScriptにはがありません。つまり、インデックス署名はキーを指す必要があります。"children"
以外のものを指定する必要があります。すべてのプロパティがあるように、あなたはPropty
タイプを開くことができいずれかstring
かnumber
の配列:
const proptyHaveChildren: ProptyHaveChildren = {
a: [1, 2, 3],
children: [1, 2, 3]
}; // no error!
:動作しますが、今はすべてのプロパティがnumbers
の配列を受け入れます
interface Propty {
[index: string]: string | ChildrenType;
}
function createElement(type: string, props: ProptyDontHaveChildren, ...children: ChildrenType) {
// no error
const newProps:ProptyHaveChildren = { children: children, ...props }
}
それはおそらくあなたが望むものではありません。
この時点で、私はあなたのインターフェイスを理解するためにTypeScriptと戦っていることに気付いています。たぶん行うための最善のことは、それは2つのプロパティが含まれるようにPropty
のあなたの表現を変更することです:すべてのものをstring
の特性、およびchildren
保持するprops
プロパティ:
type ChildrenType = Array<number>
interface Propty {
props: { [index: string]: string }
}
interface WithoutChildren {
children?: never
}
interface WithChildren {
children: ChildrenType
}
type ProptyDontHaveChildren = Propty & WithoutChildren
type ProptyHaveChildren = Propty & WithChildren
const proptyHaveChildren: ProptyHaveChildren = { props: { a: "a" }, children: [1, 2, 3] }; // works
function createElement(type: string, props: ProptyDontHaveChildren, ...children: ChildrenType) {
const newProps: ProptyHaveChildren = { children: children, props: props.props } // works
}
は今、活字体は理解し、すべてが動作します...あなたのタイプを複数のサブプロパティに分割するのを犠牲にしてください。元の構造を好むかもしれません。あなたが上記の問題に対処するのに十分なのかどうかは、あなた次第です。
希望します。がんばろう!
できません。 newPropsを作成する前に、あるいは 'newProps = {... props};を作成する前に、どのように' props ['children'] 'を削除してください。 newProps.children = children'? –