對于標準實用程式型別Required,我偶然發現了以下情況:
type A = {x?: number;}
type B1 = Required<A>['x']; // number, OK
type B2<T extends A> = Required<T>['x']; // number, OK
class C1 {
public f(x: Required<A>['x']) { // x is number, OK
const y = x 1; // OK
}
}
class C2<T extends A> {
public f(x: Required<T>['x']) { // x is number | undefined, NOT OK
const y = x 1; // ERROR
}
}
我無法想象這是預期的行為。為什么 -case 與C2-case 不同C1?起初我認為它可能與泛型有關,但由于B2-case 有效,似乎只有類泛型受到影響。
我可以做任何事情——除了明確地說x: Exclude<Required<T>['x'], undefined>——使x(以及可能的其他屬性A)真正需要(即不是未定義)嗎?
uj5u.com熱心網友回復:
所以,答案是T不等于A。這意味著它T可以是另一種型別,可以做一些事情并實作鍵,A
如果你希望它們相等,你需要這樣做。
class C2<T extends Required<A>> {
public f(x: Required<T>["x"]) {
// x is number, OK
const y = x 1; // OK
}
}
在這里,我們將創建一個具有單個 .length 屬性的介面,然后我們將使用該介面和 extends 關鍵字來表示我們的約束:
泛型檔案
升級版:
Required由{x?: number} -> {x: number}.
但如果打電話
Required<{x: number | undefined}> x仍然未定義。
當您傳遞T給 generic 然后field?: someType轉換為field: someType | undefined.
在您的情況下,您應該擺脫 undefined 兩次,以及?andundefined型別。
type FullRequired<T extends object> = Required<{
[K in keyof T]: Exclude<T[K], undefined>;
}>;
class C2<T extends A> {
public f(x: FullRequired<T>["x"]) {
// x is number OK
const y = x 1; // OK
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444756.html
上一篇:Typescript-在具有多個泛型引數的泛型型別上使用“推斷”關鍵字無法按預期作業
下一篇:從firebase實時資料庫查詢
