Types not supported
Like any library bugs keep us company. When we find a non supported type we try our best to fix it. If it takes too much time to fix it we usually update this page.
ConditionalType
type TypeName<T> =T extends string ? "string" :T extends number ? "number" :T extends boolean ? "boolean" :T extends undefined ? "undefined" :T extends Function ? "function" :"object";interface Test {conditional: TypeName<string>;}const mock = createMock<Test>();mock.conditional // should be string. It will be null
Symbol Computed Property
const testSymbol: unique symbol = Symbol('aSymbol');export interface WithSymbolComputed {[testSymbol]: string;}const mock = createMock<WithSymbolComputed>();Object.getOwnPropertySymbols(mock); //it should return the symbol testSymbol
TsAutoMock will create a property with the random name generated by typescript (example __@aSymbol) instead of the correct symbol.
Extends Mapped Type
enum SOME_ENUM {FIRST = 'FIRST',SECOND = 'SECOND',}interface IBase {someField: string;anotherField: number;}interface InterfaceWithExtendsMappedType extends Record<SOME_ENUM, IBase[]> {}const mock = createMock<InterfaceWithExtendsMappedType>();mock.FIRST // undefined, it should be IBase[]mock.SECOND // undefined, it should be IBase[]
issue Unfortunately this functionality doesnt work yet because when getting properties from an interface that extend a mapped type typescript returns a different type of property that is difficult to mock.
There is a branch created with a working version but it needs more investigation because the implementation is not readable and it may cause more issues link
Circular Generics
class C<T> {public propC: Tpublic test: string}class A extends C<A> {public propA: number}const a: A = createMock<A>();// This will fail because we will not support generics of the same type.expect(a.propC.propC.test).toBe("");
These are discussed here:
link. As of this
writing, the problem with circular generics is that the generated AST will
circle A
over and over, and result in an infinite nested tree of declaration
references. The intended behavior is to have the first back-reference stored
elsewhere in the generated output and let it reference itself, making the
runtime a lazy-evaluated sequence of getters.
Indexed access type with generics
interface StandardInterface {prop: string;}interface WithKeyGeneric<U extends keyof StandardInterface> {test(): StandardInterface[U];}const type = createMock<WithKeyGeneric<'prop'>>();expect(type.test()).toBe(''); // it will be null
These are discussed here: link. Indexed access type it's a though feature to handle correctly. There are few difference scenarios:
- From MappedTypes
type Test = {[key in keyof A]: A[key]};
- From Generics -> example above
- From literal
interface StandardInterface {prop: string;}type Hello = StandardInterface['prop'];