2016-03-21 11 views
0

, genellikle bir sınıf tipi tipini tanımlar. Bu, Type C# 'ye benzer bir çeşittir, ancak aynı zamanda doğrudan new işleci ile de örneklenebilir. bir argüman, özellik veya diğer değişken sınıfına yapılan bir başvuru içerir bekleniyorsaNeden object.constructor bir "İşlev" dir ve TypeScript'te "newable" değil? bir sınıfı, bir argüman olarak geçirilir</p> <pre><code>declare type Type = { new (...args: any[]): any } </code></pre> <p>Örneğin, bu kullanılabilir olabilir: daktilo

A constructor function that may receive any number and type of arguments, and may return anything.

(daha kesin olarak, yapıcı işlevi), Type türü her zaman: AFAIK, bu tip tanımı için etkili bir şekilde benzerdir elimde ve benim için çok yararlı.


Ancak, bazen ben sınıf (yapıcı işlevine) bir başvuru kendisi yok durumlara, sadece prototip rastlamak. Ancak, bununla birlikte tip Function taşımaktadır

obj.constructor 

tarafından sınıfa kendisi bir başvuru almak için hala mümkündür ve sınıf olarak örneğini mümkün değildir: Bu hatayı verir

new obj.constructor(); // Error: Cannot use 'new' ... 

: Ben tür iddialarını kullanırsanız

Cannot use 'new' with an expression whose type lacks a call or construct signature.

, derleyici new operatörü kabul eder ve çalışma zamanında beklendiği gibi derlenmiş kod davranır.

obj.constructor neden raftan çıkarılabilir olmadığını açıklayan bir şey var mı?

+0

Kodun tam bir örneği verebilir misiniz? Neyin olduğunu çoğaltmaya çalıştım ve neden oluşturulan jlerden ** yeni obj.constructor() ** diyemediğini anladım. Bir nesnede ** constructor ** özelliği yoktur. http://www.typescriptlang.org/Playground#src=type%20Type%20%3D%20%7B%0A%20%20%20%20new%20(...args%3A%20any%5B%5D)% 3A% 20any% 0A% 7D% 0A% 0Alet% 20a% 3A% 20Type% 20% 3D% 20class% 20A,% 20,% 7B% 0A% 20,% 20,% 20,% 20constructor()% 20,% 7B% 0A% 0A% 20,% 20,% 20,% 7D% 0A% 7D% 0A% 0Alet% 20b% 20% 3D% 20new% 20a()% 3B% 20 – toskv

cevap

2

Çünkü TypeScript şu anda constructor özelliği için özel bir işlem yapmamaktadır. defined in lib.d.ts for the Object interface,, bu nedenle yalnızca bir İşlev olarak genel olarak tanımlanabilir. İlgili konular,

https://github.com/Microsoft/TypeScript/issues/3841 ve https://github.com/Microsoft/TypeScript/issues/4356'dur.

Bunu yapabilirsin: Eğer foo türüne jenerik olmasını sağlar

class Foo { 
    constructor(public x: string) { } 
} 
var foo = new Foo("foo"); 

var bar = new (foo.constructor as { new(x: string): typeof foo })("bar"); 

(yani açıkça tip iddianın içinde Foo yazmaya gerek yok), ama yine de gerek parametreleri açıkça yazmak veya ...args: any[] ile kopyalamak için.

İlgili konular