{
            transformerDict["start"] = transformer["start"];
            if (typeof transformerDict["start"] !== "function")
                @throwTypeError("transformer.start should be a function");
        }
        if ("transform" in transformer) {
            transformerDict["transform"] = transformer["transform"];
            if (typeof transformerDict["transform"] !== "function")
                @throwTypeError("transformer.transform should be a function");
        }
        if ("flush" in transformer) {
            transformerDict["flush"] = transformer["flush"];
            if (typeof transformerDict["flush"] !== "function")
                @throwTypeError("transformer.flush should be a function");
        }

        if ("readableType" in transformer)
            @throwRangeError("TransformStream transformer has a readableType");
        if ("writableType" in transformer)
            @throwRangeError("TransformStream transformer has a writableType");
    }

    const readableHighWaterMark = @extractHighWaterMark(readableStrategy, 0);
    const readableSizeAlgorithm = @extractSizeAlgorithm(readableStrategy);

    const writableHighWaterMark = @extractHighWaterMark(writableStrategy, 1);
    const writableSizeAlgorithm = @extractSizeAlgorithm(writableStrategy);

    const startPromiseCapability = @newPromiseCapability(@Promise);
    @initializeTransformStream(this, startPromiseCapability.@promise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
    @setUpTransformStreamDefaultControllerFromTransformer(this, transformer, transformerDict);

    if ("start" in transformerDict) {
        const controller = @getByIdDirectPrivate(this, "controller");
        const startAlgorithm = () => @promiseInvokeOrNoopMethodNoCatch(transformer, transformerDict["start"], [controller]);
        startAlgorithm().@then(() => {
            //
            startPromiseCapability.@resolve.@call();
        }, (error) => {
            startPromiseCapability.@reject.@call(@undefined, error);
        });
    } else
        startPromiseCapability.@resolve.@call();

    return this;
})
