btm*_*rex 5 typescript typescript-generics
例如:
interface U {
u: boolean;
}
const f = <T extends U>() => {
const t: Partial<T> = {u: true};
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Type '{ u: true; }' is not assignable to type 'Partial<T>'.ts(2322)
Run Code Online (Sandbox Code Playgroud)
有没有办法在不强制转换的情况下解决这个问题?
TypeScript 抱怨的问题如下:
Type '{ u: true; }' is not assignable to type 'Partial<T>'.ts(2322)
您的函数f可以通过以下方式调用:
f<{ u: boolean, v: boolean }>(); // ok since U is "implemented" but not "v"
Run Code Online (Sandbox Code Playgroud)
这打开了一个选项,您在函数内提供的对象的通用和具体实现{ u: true }可能会有所不同。
TypeScript 编译器不会强制您定义与其扩展相同的类型,只要完全提供 U (在本例中为布尔标志u),您仍然可以指定 U 的更具体的实现。
interface U {
u: boolean;
}
const f = <T extends U>() => {
const t: Partial<T> = {u: true} as Partial<T>;
};
f<U>();
Run Code Online (Sandbox Code Playgroud)
缺点: { u: true }很可能被替换为:{ v: true },这可能会导致稍后在代码中出现未定义的问题。
为了告诉编译器准确使用 type U,如果可能的话,您可以尝试重新表述该函数并将常量t作为函数参数移动。
interface U {
u: boolean;
}
const f = <T>(u: T) => {
const t: Partial<T> = u;
};
f<{ u: boolean }>({ u: true });
Run Code Online (Sandbox Code Playgroud)
您的函数需要一个泛型类型,但您的函数体分配了一个具体类型,这会导致这里出现问题。您可以考虑泛型在那里是否相关。一个通用的免费替代方案是:
interface U {
u: boolean;
}
const f = () => {
const t: Partial<U> = {u: true};
};
f();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |