我正在嘗試檢查物件的型別是否是類,是否是任何類。
這是我嘗試過的:
export type IsClass<T> = (
T extends ({new (...args: any[]): any}) ? true : false
)
class SomeClass {}
const a: IsClass<number> = false;
const b: IsClass<SomeClass> = false;
const c: IsClass<({new(): any})> = true;
最后我檢查了一下,無法判斷一個型別是物件還是類,但我找不到與它相關的 Typescript 問題。
如何檢查物件的型別是否為類?
獎勵:這是如何使用實際代碼檢查它。它不會轉化為型別邏輯。
function isClass(target: any) {
return typeof target === "object" && (/^(object|array)$/i.test(target.constructor.name) === false)
}
據我所知,Typescript 知道物件和類之間的區別......有點:
const a = {};
class B{};
const testA = new a(); //error: This expression is not constructable.
const testB = new B();
但我想它不能說 testB 是一個類物件。
uj5u.com熱心網友回復:
Typescript 有兩個獨立的命名空間。一種用于代碼,一種用于型別。在代碼級別不可能沒有類。型別僅在編譯時進行分析。這是因為 Typescript 是 Javascript 的超集。所以沒有像 Java 這樣的東西,你有一個反射 API 來檢查型別結構。
你的根本問題是什么?你的目標是什么?
uj5u.com熱心網友回復:
您可以使用型別謂詞:
// returns true if 'target' is a constructor and tells TS that as well
function isClass(target: any): target is { new (...args: any[]): any } {
// one change made: 'target && ...' to check for null
return target && typeof target === "object" && (/^(object|array)$/i.test(target.constructor.name) === false)
}
// ...
if (isClass(myTarget)) new myTarget(); // works
uj5u.com熱心網友回復:
實際上,現在我進一步考慮了這一點。如果我理解正確,您可能會使用 javascript 物件的原型屬性接近您的目標:
class Cat {
static type = "cat";
public act = () => {
console.log('scratch')
}
}
const array = [
new Cat(),
{
something: 'else'
}
]
array.forEach(element => {
console.log((element as any).prototype)
})
當你用 Typescript 創建一個類時,它會得到自己的原型。對于一個簡單的物件,它仍然是空的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481466.html
標籤:打字稿
下一篇:型別錯誤:在構建專案時鍵入'(e:ChangeEvent<{value:string[]|unknown;}>)=>void'錯誤
