打字稿 -> API 如何打字的动态响应
Typescript -> a dynamic response from an API how to type
我正在使用 returns 嵌套 json 的 api。它是动态的,因此键通常会不同,但只能是对象或字符串,不能是数组或数字等。
这是一个例子:
const response = {
name: 'Pete',
location: 'London',
age: {
year: '21'
}
}
我试过这样输入:
type Response = {
[key: string]: string
}
然后在 React 组件中我想这样使用它:
type Response = {
[key: string]: string
}
const Foo = ({ data }: Response) => {
return <pre>{JSON.stringify(data, null, 2)}</pre>
}
这给了我以下错误:
Property 'x' does not exist on type 'string'
谁能给我指出正确的方向?
这是一个 link 到 stackblitz - https://stackblitz.com/edit/react-ts-4n7vcy?file=App.tsx
问题是您的类型中的值是字符串。当您提取 data
键时,它的类型是一个字符串。您要么需要像这样输入:
type Response = {
data: {
[key: string]: string
}
}
或者像
一样在组件中接受
const Foo = (data: Response) => {
// ...
}
如果您希望值是字符串或嵌套对象,您可以这样做:
type Response = {
[key: string]: string | Response
}
然后您示例中的 data
将是 string | Response
.
类型
您正在做的是将类型 Response
分配给 Foo
功能组件的 props 参数。所以实际上,Foo
组件接受类型为 Response
的 props 对象,但是 data
变量被打字稿推断为字符串。你应该做的是;
interface IFooProps{
data: Response;
}
const Foo = (props: IFooProps) => {
return <pre>{JSON.stringify(props.data, null, 2)}</pre>;
};
我正在使用 returns 嵌套 json 的 api。它是动态的,因此键通常会不同,但只能是对象或字符串,不能是数组或数字等。
这是一个例子:
const response = {
name: 'Pete',
location: 'London',
age: {
year: '21'
}
}
我试过这样输入:
type Response = {
[key: string]: string
}
然后在 React 组件中我想这样使用它:
type Response = {
[key: string]: string
}
const Foo = ({ data }: Response) => {
return <pre>{JSON.stringify(data, null, 2)}</pre>
}
这给了我以下错误:
Property 'x' does not exist on type 'string'
谁能给我指出正确的方向?
这是一个 link 到 stackblitz - https://stackblitz.com/edit/react-ts-4n7vcy?file=App.tsx
问题是您的类型中的值是字符串。当您提取 data
键时,它的类型是一个字符串。您要么需要像这样输入:
type Response = {
data: {
[key: string]: string
}
}
或者像
一样在组件中接受const Foo = (data: Response) => {
// ...
}
如果您希望值是字符串或嵌套对象,您可以这样做:
type Response = {
[key: string]: string | Response
}
然后您示例中的 data
将是 string | Response
.
您正在做的是将类型 Response
分配给 Foo
功能组件的 props 参数。所以实际上,Foo
组件接受类型为 Response
的 props 对象,但是 data
变量被打字稿推断为字符串。你应该做的是;
interface IFooProps{
data: Response;
}
const Foo = (props: IFooProps) => {
return <pre>{JSON.stringify(props.data, null, 2)}</pre>;
};