Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs TypeScript部分接口对象_Reactjs_Typescript - Fatal编程技术网

Reactjs TypeScript部分接口对象

Reactjs TypeScript部分接口对象,reactjs,typescript,Reactjs,Typescript,在React中,显示如下所示: class Component<S> { state:S; setState(state:S):void; } interface MyState { name: string; age: number; } class MyComponent extends Component<MyState> { } setState({name: "Aaron"}); 请注意,age未声明。我的问题是TypeSc

在React中,显示如下所示:

class Component<S> {
    state:S;
    setState(state:S):void;
}
interface MyState {
    name: string;
    age: number;
}
class MyComponent extends Component<MyState> { }
setState({name: "Aaron"});
请注意,
age
未声明。我的问题是TypeScript不允许这样做,它给出了一个赋值错误,比如
属性'age'丢失
。据我理解,
react.d.ts
的定义在这个意义上是错误的。但有解决办法吗

我试过这个:

setState({name: "Aaron"} as MyState);
但这会产生同样的错误,即使它不会产生错误。为什么它在操场上起作用?有什么想法吗?

目前TypeScript中仍缺少“部分类型”,请参阅以及。恐怕还不可能正确地进行这种类型的检查

您可以将
MyState
界面的所有字段标记为可选字段(通过添加
修改器),但这反过来会削弱对
组件.state
等内容的类型检查(您希望在其中设置所有字段)

编辑(2016年12月):TypeScript 2.1引入,支持使用
部分
进行描述!现在,您可以对
组件
使用以下类型定义:

class Component<S> {
    state: S;
    setState(state: Partial<S>) : void;
}
类组件{
国家:S;
设置状态(状态:部分):无效;
}

react.d.ts
定义确实是错误的,在支持之前无法修复

问题在于
setState
采用了一种与正常状态不同的部分状态。您可以通过手动指定这两种类型来解决此问题:

interface MyState {
    name: string;
    age: number;
}

interface PartialMyState {
    name?: string;
    age?: number;
}
并手动声明
MyComponent
,而不扩展提供的React
组件
类:

class MyComponent {
    state: MyState;
    setState(state:PartialMyState): void;
    //...
}
这意味着您必须为代码中的
组件
的每个子类复制这些函数定义。您可以通过定义一个正确的
组件
类来避免这种情况,该类由附加类型的部分状态概括:

class CorrectComponent<S,P> { // generalized over both state and partial state
    state:S;
    setState(state:P):void;
    //...
}

class MyComponent extends CorrectComponent<MyState,PartialMyState> { }
class-CorrectComponent{//在状态和部分状态上都是广义的
国家:S;
设置状态(状态:P):无效;
//...
}
类MyComponent扩展了CorrectComponent{}
您仍然需要为您拥有的每种状态类型编写一个部分版本



或者,您可以通过将其参数的类型更改为
Object

使
setState
成为非类型安全的,只需给出一个给定解决方法的示例,在您的情况下,您的界面将是:
interface MyState{name?:string;age?:number;}
谢谢。事实上,我避免将所有字段标记为可选字段,因为这不是真的。。。知道我的游乐场示例为什么有效吗?似乎不应该这样做?@Aaron该示例之所以有效,是因为
as MyState
充当了类型检查器的覆盖。尽管如此,我不认为同样的代码在本地构建中会失败…@MattiasBuelens它似乎与可选属性有关。这里有什么区别?@MattiasBuelens我接受了这个答案,但是我仍然不明白为什么
接口S{a:string;b:string}
使用
让s:s={a:“hi”}作为s,但如果我将
a
设为可选,如
接口S{a?:string;b:string}
,那么它会在赋值/断言中给出一个错误,即
b
缺失?我不知何故设法使部分类型使用
对象。assign
(完全使用类型检查,不必创建带有可选成员的接口声明),但我仍然不确定如何使用。相同的代码在一个项目中工作,但在另一个项目中不工作。一旦我弄明白了,我将发布更新。