Reactjs TypeScript部分接口对象
在React中,显示如下所示: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
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
(完全使用类型检查,不必创建带有可选成员的接口声明),但我仍然不确定如何使用。相同的代码在一个项目中工作,但在另一个项目中不工作。一旦我弄明白了,我将发布更新。