Используя машинописный текст, есть ли способ ограничить общий тип, чтобы разрешить только значения объекта типа? Не массив и другие типы.
Например:
function check<O extends object>(ob: O): O {
return ob
}
check({}) // should be fine
check([]) // should show error, but does not.
Возможный вариант использования в реальном мире:
function extend<A extends object, B extends object>(a: A, b: B): A & B {
return {
...a,
...b,
};
}
// This is fine, return type is { x: number } & { y: string }
extend({x: 5}, {y: "str"})
// This should not be allowed
// Return type is number[] & string[]
// Accessing a property yields impossible types like number & string
extend([1,2,3], ["s", "i", "d"])
// More examples for variants which I don't want to allow
extend({}, function() {})
extend({}, new Map())
object
не позволит примитивы, такие как число или строка. Если вам не нужны экземпляры класса, я должен подумать об этом. 05.04.2019{}
или с использованиемnew Object(){}
. В идеале он не должен допускать различных других вещей, которые будут иметь значениеtypeof
какobject
, таких как функции, массивы и экземпляры классов. Извините, я не был достаточно ясен, когда задавал вопрос. 05.04.2019__proto__ = {}
? Хотя{}
имеет свойство__proto__
, установленное на{}
, я не могу использовать это свойство в качестве ограничения типа для универсального. 05.04.2019__proto__
, поэтому у него нет связанного типа (на самом деле его использование является ошибкой). Я тоже думал оconstructor
, но это набирается какFunction
05.04.2019