定義構造函數<T>以要求特定的參數

我遇到這樣一種情況,我有一個類實例的PropertiesObjectStructure,然后需要在運行時由一個函數將ConstructorStructure轉換為實際實例。但它允許我傳入一個不遵循簽名的構造函數。見下表:

  type PropertyNames<T> = {
      [K in keyof T]: T[K] extends Function ? never : K;
  }[keyof T];

  type Struct<T> = Pick<T, PropertyNames<T>>;

  type Constructor<T> = new (struct: Struct<T>) => T;


  class MagicMonkey {
    age: number;
    name: string;

    fly() {

    }
  }

  function createObjectIntance<T>(Constructor: Constructor<T>, struct: Struct<T>): T {
    return new Constructor(struct);
  }

  const jack: MagicMonkey = createObjectIntance(MagicMonkey, { name: 'jack', age: 1000})

  console.log(jack)

Playground

MagicMonkey沒有接受參數Struct<MagicMonkey>的構造函數。我是遺漏了什么還是這是一個錯誤?

它確實迫使我在函數中編寫new Constructor(struct);,而不僅僅是new Constructor();。所以它在某種程度上起作用了。

? 最佳回答:

問題是您正在鍵入createObjectInstance以接受一個具有non-function類屬性名的對象。不是構造函數參數數組。

MagicMonkey構造函數的類型是() => MagicMonkey。鍵入所需的createObjectInstance,因為第一個數組是{ new (struct: Struct<MagicMonkey>): MagicMonkey }。它們是完全可分配的:

declare const mNoArgs: { new (): MagicMonkey }

const mStruct: { new (struct: Struct<MagicMonkey>): MagicMonkey } = mNoArgs // no error

playground link

如果您將源函數看作一個函數,只需丟棄它可能獲得的任何參數并返回我們所需的類型,那么它可能有助于理解賦值是完全類型安全的一般思想。

如果您想鍵入createObjectInstance,以便構造函數應該拒絕不兼容的參數,您應該這樣做:

function createObjectIntance<
    T, 
    Args extends unknown[]
>(ctor: { new (...args: [...Args]): T }, ...args: [...Args]): T {
  return new ctor(...args)
}

playground link

主站蜘蛛池模板: 亚洲线精品一区二区三区影音先锋| 成人免费视频一区二区| 日韩少妇无码一区二区三区| 免费无码一区二区三区蜜桃| 国产一区二区三区美女| 国产福利微拍精品一区二区| 亚洲综合无码一区二区| 激情内射亚州一区二区三区爱妻| 精品国产一区二区三区av片| 国产精品高清视亚洲一区二区| 精品一区二区久久| 国产亚洲一区二区三区在线| 久久亚洲色一区二区三区| 日本精品夜色视频一区二区| 精品无码一区二区三区水蜜桃| 欧洲精品免费一区二区三区| 日本一区二区三区日本免费| 无码精品不卡一区二区三区 | 麻豆AV无码精品一区二区| 久久国产精品视频一区| 无码精品人妻一区二区三区免费看| 国产一区二区精品久久凹凸| 国产无套精品一区二区| 美女啪啪一区二区三区| 日本不卡免费新一区二区三区| 日本欧洲视频一区| 国产电影一区二区| 无码视频一区二区三区| 国产精品无码一区二区三区在| | 国产亚洲无线码一区二区| 中文字幕久久亚洲一区| 国产成人精品一区二区三区免费| 亚洲av无码一区二区三区不卡 | 韩国福利影视一区二区三区| 中文字幕一区在线观看视频| 亚洲sm另类一区二区三区| 日韩精品免费一区二区三区| 亚洲第一区在线观看| 国产精品无码AV一区二区三区| 国产吧一区在线视频|