这段代码:
import * as React from 'react';
const Component = () => <div/>;
function culprit<P>(node: React.ReactElement<P>) {
console.log(node);
}
culprit(<Component/>);
Run Code Online (Sandbox Code Playgroud)
...使用TypeScript进行编译时产生此编译错误:
error TS2345: Argument of type 'Element' is not assignable to parameter of type 'ReactElement<any>'.
Type 'null' is not assignable to type 'ReactElement<any>
Run Code Online (Sandbox Code Playgroud)
仅当strictNullChecks TypeScript编译标志设置为时才会发生这种情况true.
是的我可以禁用该标志,但我想要它以增加编译时检查/安全性.
如果我将最后一行更改为:
culprit( (<Component/> as React.ReactElement<any>) );
Run Code Online (Sandbox Code Playgroud)
...它适用于设置为的标志true.
我最近尝试在React项目中从"普通"JavaScript迁移到TypeScript,这使我的所有测试都瘫痪,因此将所有TypeScript类型断言添加到测试代码中的所有这些事件将是一件痛苦的事.
这是一个错误,还是我别无选择?
说我有这样的代码:
import { Action, Dispatch } from 'redux';
import { ThunkAction } from 'redux-thunk';
interface StateTree {
field: string;
}
function myFunc(action: Action | ThunkAction<void, StateTree, void>,
dispatch: Dispatch<StateTree>) {
dispatch(action); // <-- This is where the error comes from
}
Run Code Online (Sandbox Code Playgroud)
...我从TypeScript编译器中得到此错误:
ERROR in myFile.ts:x:y
TS2345: Argument of type 'Action | ThunkAction<void, StateTree, void>' is not assignable to parameter of type 'Action'.
Type 'ThunkAction<void, StateTree, void>' is not assignable to type 'Action'.
Property 'type' is missing in type 'ThunkAction<void, StateTree, …Run Code Online (Sandbox Code Playgroud) 我有一堆单元测试文件,所有这些文件都由 django.test.TestCase 类组成。
自己写了一个小 shell 脚本来取消注释/注释我的 __init__.py 文件中的测试文件导入,因此我可以根据我提供的命令行参数从某些测试文件运行测试。我还能够一次性运行所有测试文件的所有测试(用于回归测试)。
我有一个包含一些 JSON 固定装置的测试文件,第一个测试检查某个模型/表中是否有 3 条记录(由 JSON 固定装置定义)。
所以问题来了:当我自己运行这个测试文件时,它的测试以优异的成绩通过,但是当我用所有其他测试运行测试时,我提到的那个特定的测试用例失败了。
当我运行所有测试时,数据库说表/模型中有 6 条记录,但应该只有 3 条(来自夹具),就像测试文件本身运行时一样。
我还尝试使用其他一些测试文件(不是全部)运行该测试文件,并且它通过了。所以唯一没有的时候,是当所有测试文件都运行时。
对我来说,这似乎是 Django 或 PostgreSQL(我正在使用的数据库)中的一个错误,因为 Django TestCases 不应该在每个测试方法之间自动刷新/重置数据库,更不用说测试类了?
我有一个像这样结构的Django项目:
appname/
models/
__init__.py
a.py
base.py
c.py
Run Code Online (Sandbox Code Playgroud)
... appname/models/__ init__.py只包含这样的语句:
from appname.models.base import Base
from appname.models.a import A
from appname.models.c import C
Run Code Online (Sandbox Code Playgroud)
...以及appname/models/base.py包含的位置:
import django.db.models
class Base(django.db.models.Model):
...
Run Code Online (Sandbox Code Playgroud)
以及appname/models/a.py包含的位置:
import appname.models as models
class A(models.Base):
....
Run Code Online (Sandbox Code Playgroud)
...同样适用于appname/models/c.py等.
我很满意我的代码结构,但当然它不起作用,因为循环导入.
当appname/__ init__.py运行时,appname/models/a.py将运行,但该模块导入"appname.models",尚未完成执行.经典循环导入.
所以这应该表明我的代码结构很差,需要重新设计以避免循环依赖.
有什么选择呢?
我能想到的一些解决方案,以及为什么我不想使用它们:
所以我的问题不仅仅是如何避免循环导入,而是以一种与我试图实现的方式一样干净(如果不是更干净)的方式.
有没有人有更好的方法?
我知道,如果您SubmissionError从handleSubmit()函数中抛出a ,则redux-form代码将填充相应字段和/或表单本身的错误。
但是,设置字段/表单错误的API将我们的实现紧密结合在一起handleSumbit(),成为了redux-form代码的调用者(其中包含SubmissionError异常处理程序)。
我的用例是这样的:
function asyncActionDispatcher(values) {
return (dispatch, getState) => {
// I'm using getState, which is not accessible in handleSubmit()
// But I'd also like to be able to set errors on the form fields and/or the
// form.
};
}
function handleSubmit(values, dispatch) {
dispatch(
asyncActionDispatcher(values)
);
}
Run Code Online (Sandbox Code Playgroud)
我不能抛出SubmissionErrorin,asyncActionDispatcher()因为它是by redux和not 调用的redux-form。
是否redux-form有其他API可以在字段/表单上设置错误?
interface A {
a: number;
}
let myVar: A = {
a: 123
};
myVar = Object.assign({}, myVar, {
b: 456
});
Run Code Online (Sandbox Code Playgroud)
为什么TypeScript不会抱怨myVar通过Object.assign()调用重新分配?
鉴于该Object.assign()调用的类型定义是:
assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;
Run Code Online (Sandbox Code Playgroud)
...和我的调用中三种类型的(返回类型)交集不匹配interface A,编译器不应该选择那个吗?
问题与TypeScript无法推断函数调用中的类型无关,因为如果我将代码更改为:
interface A {
a: number;
}
interface B {
b: number;
}
interface C {}
let myVar: A = {
a: 345
};
myVar = Object.assign<C, A, B>({}, myVar, {
b: 345 …Run Code Online (Sandbox Code Playgroud) typescript ×3
reactjs ×2
redux ×2
redux-thunk ×2
autoflush ×1
django ×1
django-tests ×1
javascript ×1
python ×1
react-redux ×1
redux-form ×1
testcase ×1
testing ×1