递归类型定义似乎无法处理泛型?
Recursive type definitions does not seem to work handle generics?
我认为这是 Typescript 中的错误,我将其作为问题提交 here。我不希望它被修复(至少不会很快,所以我想问问你们,有没有人碰巧有比 create_1 更好的 solution/work-around 的想法?
代码
type RecursivePartial<T> = {
[P in keyof T]?: RecursivePartial<T[P]>;
};
type State<T> = { value: T };
function create_1<T>(){
let _x: RecursivePartial<State<T>>;
let _y: State<RecursivePartial<T>>;
_x = _y;
}
function create_2<T>(){
/*
*/
let x: RecursivePartial<State<T>>;
let y: State<T>;
/*
Type 'State<T>' is not assignable to type RecursivePartial<State<T>>'.
Types of property 'value' are incompatible.
Type 'T' is not assignable to type RecursivePartial<T>[P]>'.
Type 'T[string]' is not assignable to type 'RecursivePartial<T[P]>'.
*/
x = y;
}
预期行为:
我原以为第二个例子是有效的打字稿,即 State 应该可以分配给 RecursivePartial>。这应该是这种情况,因为任何状态都是它自己的一部分,因为 T 是相同的类型。
实际行为:
我收到类型错误(见上文),递归类型定义似乎在遇到泛型时中断?
TS游乐场link
可以在这里确认代码和类型错误; ts-playground example
我觉得这像是一个错误。解决方法:
正如我在 the Github issue, the first and best workaround is probably to turn on the strictNullChecks
compiler option 中注意到的那样。我真的建议打开它并在一般情况下保持打开状态,因为它非常有用。
如果你不想这样做,你总是可以只使用 type assertion 告诉编译器你比它更了解类型。如果编译器真的拒绝做断言,你可以通过 any
的断言来传递它,像这样:
function create_2<T>(){
let x: RecursivePartial<State<T>>;
let y: State<T>;
x = y as any as RecursivePartial<State<T>>; // I know it!
}
如果您不想这样做,可以将 RecursivePartial<>
的定义更改为以下内容:
type RecursivePartial<T> = {
[P in keyof T]?: T[P] | RecursivePartial<T[P]>;
};
我相信这实际上是同一件事,但编译器更容易看到您始终可以将类型 T
的值分配给类型 RecursivePartial<T>
的变量。
希望对您有所帮助。祝你好运!
我认为这是 Typescript 中的错误,我将其作为问题提交 here。我不希望它被修复(至少不会很快,所以我想问问你们,有没有人碰巧有比 create_1 更好的 solution/work-around 的想法?
代码
type RecursivePartial<T> = {
[P in keyof T]?: RecursivePartial<T[P]>;
};
type State<T> = { value: T };
function create_1<T>(){
let _x: RecursivePartial<State<T>>;
let _y: State<RecursivePartial<T>>;
_x = _y;
}
function create_2<T>(){
/*
*/
let x: RecursivePartial<State<T>>;
let y: State<T>;
/*
Type 'State<T>' is not assignable to type RecursivePartial<State<T>>'.
Types of property 'value' are incompatible.
Type 'T' is not assignable to type RecursivePartial<T>[P]>'.
Type 'T[string]' is not assignable to type 'RecursivePartial<T[P]>'.
*/
x = y;
}
预期行为: 我原以为第二个例子是有效的打字稿,即 State 应该可以分配给 RecursivePartial>。这应该是这种情况,因为任何状态都是它自己的一部分,因为 T 是相同的类型。
实际行为: 我收到类型错误(见上文),递归类型定义似乎在遇到泛型时中断?
TS游乐场link 可以在这里确认代码和类型错误; ts-playground example
我觉得这像是一个错误。解决方法:
正如我在 the Github issue, the first and best workaround is probably to turn on the strictNullChecks
compiler option 中注意到的那样。我真的建议打开它并在一般情况下保持打开状态,因为它非常有用。
如果你不想这样做,你总是可以只使用 type assertion 告诉编译器你比它更了解类型。如果编译器真的拒绝做断言,你可以通过 any
的断言来传递它,像这样:
function create_2<T>(){
let x: RecursivePartial<State<T>>;
let y: State<T>;
x = y as any as RecursivePartial<State<T>>; // I know it!
}
如果您不想这样做,可以将 RecursivePartial<>
的定义更改为以下内容:
type RecursivePartial<T> = {
[P in keyof T]?: T[P] | RecursivePartial<T[P]>;
};
我相信这实际上是同一件事,但编译器更容易看到您始终可以将类型 T
的值分配给类型 RecursivePartial<T>
的变量。
希望对您有所帮助。祝你好运!