pet*_*gan 7 javascript typescript ecmascript-6 reactjs union-types
I have defined two types, Team
and Position
. They are both part of an array that I iterate over in my react component.
based on the types defined below in my map
function I am seeing the following error.
Examples of errors I am seeing.
Property 'name' does not exist on type 'Position'. [2339]
Property 'position' does not exist on type 'Team'. [2339]
Is it not possible to check that the array contains either type?
My code looks like as follows:
type Team = {
name: string;
city: string;
}
type Position = {
position: number;
}
const Component = () => {
const teamsAndPosition = [
{
name: 'Arsenal',
city: 'London',
},
{
name: 'Everton',
city: 'Liverpool',
},
{
position: 2
}
];
const [list, setList] = useState<Array<Team | Position >>(teams)
list.map((item: Team | Position) => {
return item.name ? (
<div>
// I am seeing an error for these below
<p>{item.name}</p>
<p>{item.city}</p>
</div>
) : (
<p>{item.position}</p>
)
})
}
Run Code Online (Sandbox Code Playgroud)
当处理可能是两种(或多种)类型之一的变量时,您可以在处理对象之前检查对象上是否存在唯一属性,以便打字稿可以推断出它是什么类型。
例子:
interface IObjectYo {
someProp: number
same: boolean
}
interface IDifObjYo {
otherProp: number
same: boolean
}
function example(someArg: IObjectYo | IDifObjYo) {
console.log(someArg.someProp) // tsc complains because someProp doesn't belong to IDifObjYo
if ('someProp' in someArg) {
console.log(someArg.someProp) // tsc knows it must be type IObjectYo because someProp only belongs to IObjectYo
} else {
console.log(someArg.otherProp) // tsc knows this is IDifObjYo because the first condition failed (which means it must be of type IDifObjYo)
}
if ('same' in someArg) {
console.log(someArg.someProp) // make sure the property is indeed unique between the possible types or tsc can't infer
}
}
Run Code Online (Sandbox Code Playgroud)
就你而言(我不是 React 人)你可以这样做:
type Team = {
name: string;
city: string
}
type Position = {
position: number;
}
const Component = () => {
const [list, setList] = useState<Array<Team | Position >>(teams)
list.map((item: Team | Position) => {
return 'name' in item ? (
<div>
<p>{item.name}</p>
<p>{item.city}</p>
</div>
) : (
<p>{item.position}</p>
)
})
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6090 次 |
最近记录: |