Типскрипт InstanceType ‹T› ведет себя не так, как я мог бы представить

У меня есть следующий код:

class Factory<K, T extends new (...p: any) => any> {
    add(key: K, fn: (...p: ConstructorParameters<T>) => InstanceType<T>) {
    }
}

class Foo {
    constructor(a: number) {
    }
}

class Boo {
    constructor(a: number) {
    }
}

new Factory<number, typeof Foo>().add(1, (a) => new Boo(a))

Я бы предположил, что это не должно быть скомпилировано, поскольку Boo не является производным от Foo. Но работает нормально.

Я что-то упускаю?

площадка


person pankleks    schedule 25.05.2021    source источник
comment
TypeScript - это язык со структурной типизацией, если два объекта имеют одинаковую форму, они считаются одним типом. Если вы добавите в Foo что-то, чего нет у Boo, он перестанет компилироваться.   -  person Nadia Chibrikova    schedule 25.05.2021
comment
@NadiaChibrikova права. Вот официальное объяснение: typescriptlang.org / docs / handbook /. но если вам нужны номинальные типы, есть несколько уловок: basarat .gitbook.io / typescript / main-1 / nominaltyping, michalzalecki.com/ nominal-typing-in-typescript, betterprogramming.pub/nominal-typescript-eee36e9432d2   -  person Inigo    schedule 25.05.2021
comment
Также говорят о введении какой-то встроенной поддержки номинальных типов: github.com/microsoft/ TypeScript / issues / 202 и github.com/microsoft/TypeScript/pull/33038 < / а>   -  person Inigo    schedule 25.05.2021
comment
Также по теме: stackoverflow.com/a/55281684/11407695   -  person Oleg Valter    schedule 26.05.2021
comment
Полезно читать extends как присваиваемый, поэтому ваш параметр универсального типа просто должен быть назначен typeof Foo, что Boo (благодаря структурной типизации, как сказала @NadiaChibrikova).   -  person superhawk610    schedule 26.05.2021